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
|