diff options
author | toshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8> | 2012-03-10 10:18:10 +0000 |
---|---|---|
committer | toshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8> | 2012-03-10 10:18:10 +0000 |
commit | dc0de2400c75ac1540b89c10dff22bda4742d569 (patch) | |
tree | 147fedb1bc806c97cd0a8c4c22bd901d24ffe308 /core/plugin.rb | |
parent | 60b670a3301b0e1b5a47cbc6040a793ea421d888 (diff) | |
download | mikutter-dc0de2400c75ac1540b89c10dff22bda4742d569.tar.gz |
ふぁぼイベントが多重に発生しないようにした
git-svn-id: svn://toshia.dip.jp/mikutter/trunk@705 03aab468-d3d2-4883-8b12-f661bbf03fa8
Diffstat (limited to 'core/plugin.rb')
-rw-r--r-- | core/plugin.rb | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/core/plugin.rb b/core/plugin.rb index 5674bde2..3ee02653 100644 --- a/core/plugin.rb +++ b/core/plugin.rb @@ -216,6 +216,11 @@ class Plugin deleter = lambda{|events| events[event_name.to_sym].reject!{ |e| e[1] == event } } deleter.call(@@event) or deleter.call(@@event_filter) or deleter.call(@@add_event_hook) end + # フィルタ内部で使う。フィルタの実行をキャンセルする。Plugin#filtering はfalseを返し、 + # イベントのフィルタの場合は、そのイベントの実行自体をキャンセルする + def filter_cancel! + throw :filter_exit, false end + # フィルタ関数を用いて引数をフィルタリングする def filtering(event_name, *args) length = args.size @@ -233,7 +238,8 @@ class Plugin # 実際には、これが呼ばれたあと、することがなくなってから呼ばれるので注意。 def call(event_name, *args) Delayer.new{ - plugin_callback_loop(@@event, event_name, :proc, *filtering(event_name, *args)) } end + filtered = filtering(event_name, *args) + plugin_callback_loop(@@event, event_name, :proc, *filtered) if filtered } end # イベントが追加されたときに呼ばれるフックを呼ぶ。 # _callback_ には、登録されたイベントのProcオブジェクトを渡す @@ -429,10 +435,30 @@ Module.new do [messages.select{ |m| appeared.add(m[:id].to_i) if m and not(appeared.include?(m[:id].to_i)) }] } - Plugin.create(:core).add_event(:appear){ |messages| - retweets = messages.select(&:retweet?) - if not(retweets.empty?) - Plugin.call(:retweet, retweets) end } + Plugin.create(:core) do + favorites = Hash.new{ |h, k| h[k] = Set.new } # {user_id: set(message_id)} + unfavorites = Hash.new{ |h, k| h[k] = Set.new } # {user_id: set(message_id)} + + onappear do |messages| + retweets = messages.select(&:retweet?) + if not(retweets.empty?) + Plugin.call(:retweet, retweets) end end + + # 同じツイートに対するfavoriteイベントは一度しか発生させない + filter_favorite do |service, user, message| + Plugin.filter_cancel! if favorites[user[:id]].include? message[:id] + favorites[user[:id]] << message[:id] + [service, user, message] + end + + # 同じツイートに対するunfavoriteイベントは一度しか発生させない + filter_unfavorite do |service, user, message| + Plugin.filter_cancel! if unfavorites[user[:id]].include? message[:id] + unfavorites[user[:id]] << message[:id] + [service, user, message] + end + + end end |