File: ratelimit.rb

package info (click to toggle)
mikutter 3.8.6%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 10,544 kB
  • sloc: ruby: 20,548; sh: 99; makefile: 19
file content (48 lines) | stat: -rw-r--r-- 1,961 bytes parent folder | download
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
# -*- coding: utf-8 -*-
require 'set'

Plugin.create :ratelimit do
  defactivity "ratelimit", _("規制通知")

  notificated = Set.new
  ratelimit_filter_mutex = Mutex.new

  on_ratelimit do |service, ratelimit|
    Plugin.call(:gui_window_rewindstatus, Plugin::GUI::Window.instance(:default), _("API %{endpoint} %{remain}/%{limit}回くらい (%{refresh_time}まで)") % {
                  endpoint: ratelimit.endpoint,
                  remain: ratelimit.remain,
                  limit: ratelimit.limit,
                  refresh_time: ratelimit.reset.strftime(_('%Y/%m/%d %H:%M:%S'))
                }, 30)
    if ratelimit.limit?
      title = _("エンドポイント `%{endpoint}' が規制されました。%{refresh_time}に解除されます。") % {
        endpoint: ratelimit.endpoint,
        refresh_time: ratelimit.reset.strftime(_('%Y/%m/%d %H:%M:%S')) }
      activity(:ratelimit, title,
               service: service,
               description: "#{title}\n" + _("%{endpoint} は%{minute}分に %{limit} 回までのアクセスが許可されています。頻発するようなら同時に使用するTwitterクライアントを減らすか、設定を見直しましょう") % {
                 endpoint: ratelimit.endpoint,
                 minute: 15,
                 limit: ratelimit.limit })
    end
  end

  on_mikutwitter_ratelimit do |mikutwitter, ratelimit|
    service = Enumerator.new{|y|
      Plugin.filtering(:worlds, y)
    }.find{|world|
      world.class.slug == :twitter && world.twitter == mikutwitter
    }
    Plugin.call(:ratelimit, service, ratelimit) if service and ratelimit end

  filter_ratelimit do |service, ratelimit|
    ratelimit_filter_mutex.synchronize {
      if notificated.include? ratelimit
        Plugin.filter_cancel!
      else
        notificated << ratelimit
        Reserver.new(ratelimit.reset, thread: Thread){ notificated.delete(ratelimit) } end }
    [service, ratelimit]
  end

end