Class: Kodo::Memory::Reminders

Inherits:
Object
  • Object
show all
Defined in:
lib/kodo/memory/reminders.rb

Constant Summary collapse

MAX_ACTIVE =
50
MAX_CONTENT_LENGTH =
500

Instance Method Summary collapse

Constructor Details

#initialize(passphrase: nil) ⇒ Reminders

Returns a new instance of Reminders.



13
14
15
16
17
18
# File 'lib/kodo/memory/reminders.rb', line 13

def initialize(passphrase: nil)
  @reminders_dir = File.join(Kodo.home_dir, "memory", "reminders")
  @passphrase = passphrase
  FileUtils.mkdir_p(@reminders_dir)
  @reminders = load_reminders
end

Instance Method Details

#active_count ⇒ Object



68
69
70
# File 'lib/kodo/memory/reminders.rb', line 68

def active_count
  all_active.length
end

#add(content:, due_at:, channel_id: nil, chat_id: nil) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/kodo/memory/reminders.rb', line 20

def add(content:, due_at:, channel_id: nil, chat_id: nil)
  if active_count >= MAX_ACTIVE
    raise Kodo::Error, "Too many active reminders (max #{MAX_ACTIVE}). Dismiss some first."
  end

  now = Time.now.iso8601
  reminder = {
    "id" => SecureRandom.uuid,
    "content" => content,
    "due_at" => due_at.is_a?(Time) ? due_at.iso8601 : due_at,
    "channel_id" => channel_id,
    "chat_id" => chat_id,
    "status" => "active",
    "created_at" => now
  }

  @reminders << reminder
  save_reminders
  reminder
end

#all_active ⇒ Object



64
65
66
# File 'lib/kodo/memory/reminders.rb', line 64

def all_active
  @reminders.select { |r| r["status"] == "active" }
end

#dismiss(id) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/kodo/memory/reminders.rb', line 41

def dismiss(id)
  reminder = @reminders.find { |r| r["id"] == id && r["status"] == "active" }
  return nil unless reminder

  reminder["status"] = "dismissed"
  save_reminders
  reminder
end

#due_reminders ⇒ Object



59
60
61
62
# File 'lib/kodo/memory/reminders.rb', line 59

def due_reminders
  now = Time.now
  all_active.select { |r| Time.parse(r["due_at"]) <= now }
end

#fire!(id) ⇒ Object



50
51
52
53
54
55
56
57
# File 'lib/kodo/memory/reminders.rb', line 50

def fire!(id)
  reminder = @reminders.find { |r| r["id"] == id && r["status"] == "active" }
  return nil unless reminder

  reminder["status"] = "fired"
  save_reminders
  reminder
end