File: delayer.rb

package info (click to toggle)
mikutter 4.1.3%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 9,260 kB
  • sloc: ruby: 20,126; sh: 183; makefile: 19
file content (59 lines) | stat: -rw-r--r-- 1,917 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
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
53
54
55
56
57
58
59
# -*- coding: utf-8 -*-

require "delayer"
require "delayer/deferred"

Delayer.default = Delayer.generate_class(
  priority: %i[
    ui_response
    routine_active
    ui_passive
    routine_passive
    ui_favorited
    destroy_cache
  ],
  default: :routine_passive,
  expire: 0.02)

Deferred = Delayer::Deferred::Deferred

module Delayer::Deferred::Deferredable::Chainable
  # エラーをキャッチして、うまい具合にmikutterに表示する。
  # このあとにdeferredをくっつけることもできるが、基本的にはdeferredチェインの終了の時に使う。
  # なお、terminateは受け取ったエラーを再度発生させるので、terminateでエラーを処理した後に特別なエラー処理を挟むこともできる
  # ==== Args
  # [message] 表示用エラーメッセージ。偽ならエラーはユーザに表示しない(コンソールのみ)
  # [&message_generator] エラーを引数に呼ばれる。 _message_ を返す
  # ==== Return
  # Deferred
  def terminate(message = nil, &message_generator)
    defer = self.trap do |exception|
      message = message_generator.call(exception) if message_generator
      begin
        notice exception
        if Mopt.debug
          if command_exist?('dot')
            notice "[[#{defer.graph_draw}]]"
          else
            notice defer.graph
          end
        end
        if message
          if(exception.is_a?(Net::HTTPResponse))
            Plugin.activity :error, "#{message} (#{exception.code} #{exception.body})"
          else
            exception = 'error' if not exception.respond_to?(:to_s)
            Plugin.activity :error, "#{message} (#{exception})", exception: exception
          end
        end
      rescue Exception => inner_error
        error inner_error
      end
      Deferred.fail(exception)
    end
  end
end

Delayer.register_remain_hook do
  Thread.main.wakeup
end