Class: ReminderTask

Inherits:
Object
  • Object
show all
Defined in:
lib/reminder/task.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(index, attrs) ⇒ ReminderTask

Returns a new instance of ReminderTask.



5
6
7
8
9
10
11
# File 'lib/reminder/task.rb', line 5

def initialize(index, attrs)
  @index = index
  attrs.each_pair do |attr, val|
    send("#{attr.to_s}=".to_sym, val) unless val.nil?
  end
  
end

Instance Attribute Details

#indexObject

Returns the value of attribute index.



4
5
6
# File 'lib/reminder/task.rb', line 4

def index
  @index
end

#jobObject

Returns the value of attribute job.



4
5
6
# File 'lib/reminder/task.rb', line 4

def job
  @job
end

#repeat_countObject

Returns the value of attribute repeat_count.



4
5
6
# File 'lib/reminder/task.rb', line 4

def repeat_count
  @repeat_count
end

#repeat_jobObject

Returns the value of attribute repeat_job.



4
5
6
# File 'lib/reminder/task.rb', line 4

def repeat_job
  @repeat_job
end

Class Method Details

.attrsObject



145
146
147
# File 'lib/reminder/task.rb', line 145

def attrs
  [:c_at, :user_id, :user_name, :room, :type, :time, :first, :task, :repeat, :repeat_interval]
end

.from_message(index, message, source) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/reminder/task.rb', line 119

def from_message(index, message, source)
  attrs = {}
  if message['who'] == 'me'
    attrs['user_id'] = source.user.id
    attrs['user_name'] = source.user.name
  elsif message['who'] == 'here'
    attrs['room'] = source.room
  else
    re = /^(user\s+id\s+(?<user_id>.*))?^(user\s+name\s+(?<user_id>.*))?(room \s+(?<room>.*))?$/
    m = re.match(message['who'])
    attrs = attrs.merge(m)
  end
  attrs['type'] = message['type']
  attrs['time'] = message['time']
  attrs['first'] = Chronic.parse(message['first']) unless message['first'].nil?
  attrs['repeat'] = message['repeat']
  attrs['repeat_interval'] = message['repeat_interval'] || '10m'
  attrs['task'] = message['task']
  if attrs['type'] == 'in'
    attrs['type'] = 'at'
    attrs['time'] = (Time.now + Rufus.parse_time_string(attrs['time'])).to_s
  end
  attrs['c_at'] = Time.now.to_s

  ReminderTask.new index, attrs
end

.load(index, string) ⇒ Object



148
149
150
151
152
153
154
155
# File 'lib/reminder/task.rb', line 148

def load(index, string)
  if string.nil? || string == ''
    nil
  else
    attrs = MultiJson.load(string)
    ReminderTask.new index, attrs
  end
end

Instance Method Details

#dieObject



83
84
85
86
# File 'lib/reminder/task.rb', line 83

def die
  @job.unschedule unless @job.nil?
  @repeat_job.unschedule unless @repeat_job.nil?
end

#dumpObject



110
111
112
113
114
115
116
# File 'lib/reminder/task.rb', line 110

def dump
  hash = {}
  ReminderTask.attrs.each do |attr|
    hash[attr] = send(attr) unless send(attr).nil?
  end
  MultiJson.dump(hash)
end

#killObject



79
80
81
# File 'lib/reminder/task.rb', line 79

def kill
  @handler.kill(index)
end

#messageObject



88
89
90
# File 'lib/reminder/task.rb', line 88

def message
  "Reminder #{index}: #{task}"
end

#repeatObject



62
63
64
65
66
67
68
69
# File 'lib/reminder/task.rb', line 62

def repeat
  @handler.robot.send_message(target, message)
  if repeat != 'many'
    if repeat_count > repeat
      stop_repeat
    end
  end
end

#runObject



51
52
53
54
55
56
57
58
59
60
# File 'lib/reminder/task.rb', line 51

def run
  @handler.robot.send_message(target, message)
  if repeat
    @repeat_job = @handler.scheduler.every repeat_interval do
      repeat()
    end
  elsif !@periodic
    kill
  end
end

#start_job(handler) ⇒ Object



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
# File 'lib/reminder/task.rb', line 13

def start_job(handler)
  @handler = handler
  scheduler = @handler.scheduler

  @periodic = false
  @job = 
    # "in" is converted to "at" upon creation
    if type == 'at'
      at = Chronic.parse(@time, now: Time.parse(@c_at))
      if at < Time.now
        run()
      else
        scheduler.at at do
          run()
        end
      end
    elsif type == 'cron'
      @periodic = true
      scheduler.cron @time do
        run()
      end
    elsif type == 'every'
      @periodic = true
      scheduler.every @time, first_at: Time.parse(@first) do
        run()
      end
    end
end

#stop_repeatObject



71
72
73
74
75
76
77
# File 'lib/reminder/task.rb', line 71

def stop_repeat
  @repeat_job.unschedule
  @repeat_job = nil
  unless @periodic
    kill
  end
end

#targetObject



42
43
44
45
46
47
48
49
# File 'lib/reminder/task.rb', line 42

def target
  if user_id.nil? && user_name.nil?
    user = nil
  else
    user = Lita::User.create(user_id, name: user_name)
  end
  Lita::Source.new(user, room)
end

#to_sObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/reminder/task.rb', line 92

def to_s
  ret = "reminder #{index}, next run: #{@job.nil? ? 'unknown yet' : @job.next_time.to_s} "
  if room.nil? || room == ''
    ret += "user:#{user_id} #{user_name}"
  else
    ret += "room:#{room}"
  end
  ret += " type:#{type} time:#{time}"
  if type == "every"
    ret += " first_at:#{first}"
  end
  ret += " task:#{task}"
  if !repeat.nil? && repeat != ""
    ret += " repeat:#{repeat} times every #{repeat_interval}"
  end
  ret
end