Module: Earthquake::Core

Included in:
Earthquake
Defined in:
lib/earthquake/core.rb

Instance Method Summary (collapse)

Instance Method Details

- (Object) _init



34
35
36
37
38
39
# File 'lib/earthquake/core.rb', line 34

def _init
  load_config
  load_plugins
  inits.each { |block| class_eval(&block) }
  inits.clear
end

- (Object) _once



30
31
32
# File 'lib/earthquake/core.rb', line 30

def _once
  onces.each { |block| class_eval(&block) }
end

- (Object) async(&block)



182
183
184
# File 'lib/earthquake/core.rb', line 182

def async(&block)
  Thread.start(&block)
end

- (Object) config



6
7
8
# File 'lib/earthquake/core.rb', line 6

def config
  @config ||= {}
end

- (Object) error(e)



186
187
188
# File 'lib/earthquake/core.rb', line 186

def error(e)
  notify "[ERROR] #{e.message}\n#{e.backtrace.join("\n")}"
end

- (Object) init(&block)



18
19
20
# File 'lib/earthquake/core.rb', line 18

def init(&block)
  inits << block
end

- (Object) inits



14
15
16
# File 'lib/earthquake/core.rb', line 14

def inits
  @inits ||= []
end

- (Object) item_queue



10
11
12
# File 'lib/earthquake/core.rb', line 10

def item_queue
  @item_queue ||= []
end

- (Object) load_config



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/earthquake/core.rb', line 49

def load_config
  # TODO: parse argv
  config[:dir]              ||= File.expand_path(ARGV[0] || '~/.earthquake')
  config[:time_format]      ||= Time::DATE_FORMATS[:short]
  config[:plugin_dir]       ||= File.join(config[:dir], 'plugin')
  config[:file]             ||= File.join(config[:dir], 'config')
  config[:consumer_key]     ||= 'RmzuwQ5g0SYObMfebIKJag'
  config[:consumer_secret]  ||= 'V98dYYmWm9JoG7qfOF0jhJaVEVW3QhGYcDJ9JQSXU'

  [config[:dir], config[:plugin_dir]].each do |dir|
    unless File.exists?(dir)
      FileUtils.mkdir_p(dir)
    end
  end

  if File.exists?(config[:file])
    load config[:file]
  else
    File.open(config[:file], 'w')
  end

  get_access_token unless self.config[:token] && self.config[:secret]
end

- (Object) load_plugins



73
74
75
76
77
78
79
80
81
# File 'lib/earthquake/core.rb', line 73

def load_plugins
  Dir[File.join(config[:plugin_dir], '*.rb')].each do |lib|
    begin
      require_dependency lib
    rescue Exception => e
      error e
    end
  end
end

- (Object) mutex



172
173
174
# File 'lib/earthquake/core.rb', line 172

def mutex
  @mutex ||= Mutex.new
end

- (Object) notify(message, options = {:title => 'earthquake'}) Also known as: n



190
191
192
193
# File 'lib/earthquake/core.rb', line 190

def notify(message, options = {:title => 'earthquake'})
  message = message.is_a?(String) ? message : message.inspect
  Notify.notify options[:title], message
end

- (Object) once(&block)



26
27
28
# File 'lib/earthquake/core.rb', line 26

def once(&block)
  onces << block
end

- (Object) onces



22
23
24
# File 'lib/earthquake/core.rb', line 22

def onces
  @once ||= []
end

- (Object) reconnect



115
116
117
118
# File 'lib/earthquake/core.rb', line 115

def reconnect
  item_queue.clear
  start_stream(:host  => 'userstream.twitter.com', :path  => '/2/user.json', :ssl => true)
end

- (Object) reload



41
42
43
44
45
46
47
# File 'lib/earthquake/core.rb', line 41

def reload
  loaded = ActiveSupport::Dependencies.loaded.dup
  ActiveSupport::Dependencies.clear
  loaded.each { |lib| require_dependency lib }
ensure
  _init
end

- (Object) restore_history



165
166
167
168
169
170
# File 'lib/earthquake/core.rb', line 165

def restore_history
  history_file = File.join(config[:dir], 'history')
  if File.exists?(history_file)
    File.read(history_file).split(/\n/).each { |line| Readline::HISTORY << line }
  end
end

- (Object) start(*argv)



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/earthquake/core.rb', line 83

def start(*argv)
  _init
  _once
  restore_history

  EventMachine::run do
    Thread.start do
      while buf = Readline.readline("", true)
        unless Readline::HISTORY.count == 1
          Readline::HISTORY.pop if buf.empty? || Readline::HISTORY[-1] == Readline::HISTORY[-2]
        end
        sync { input(buf.strip) }
      end
    end

    Thread.start do
      loop do
        if Readline.line_buffer.nil? || Readline.line_buffer.empty?
          sync { output }
          sleep 1
        else
          sleep 2
        end
      end
    end

    reconnect

    trap('TERM') { stop }
  end
end

- (Object) start_stream(options)



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
145
146
# File 'lib/earthquake/core.rb', line 120

def start_stream(options)
  stop_stream

  options = {
    :oauth => config.slice(:consumer_key, :consumer_secret).merge(
      :access_key => config[:token], :access_secret => config[:secret]
    )
  }.merge(options)

  @stream = ::Twitter::JSONStream.connect(options)

  @stream.each_item do |item|
    item_queue << JSON.parse(item)
  end

  @stream.on_error do |message|
    notify "error: #{message}"
  end

  @stream.on_reconnect do |timeout, retries|
    notify "reconnecting in: #{timeout} seconds"
  end

  @stream.on_max_reconnects do |timeout, retries|
    notify "Failed after #{retries} failed reconnects"
  end
end

- (Object) stop



152
153
154
155
# File 'lib/earthquake/core.rb', line 152

def stop
  stop_stream
  EventMachine.stop_event_loop
end

- (Object) stop_stream



148
149
150
# File 'lib/earthquake/core.rb', line 148

def stop_stream
  @stream.stop if @stream
end

- (Object) store_history



157
158
159
160
161
162
163
# File 'lib/earthquake/core.rb', line 157

def store_history
  history_size = config[:history_size] || 1000
  File.open(File.join(config[:dir], 'history'), 'w') do |file|
    lines = Readline::HISTORY.to_a[([Readline::HISTORY.size - history_size, 0].max)..-1]
    file.print(lines.join("\n"))
  end
end

- (Object) sync(&block)



176
177
178
179
180
# File 'lib/earthquake/core.rb', line 176

def sync(&block)
  mutex.synchronize do
    block.call
  end
end