aboutsummaryrefslogtreecommitdiffstats
path: root/core/plugin.rb
diff options
context:
space:
mode:
authortoshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8>2012-03-10 10:18:10 +0000
committertoshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8>2012-03-10 10:18:10 +0000
commitdc0de2400c75ac1540b89c10dff22bda4742d569 (patch)
tree147fedb1bc806c97cd0a8c4c22bd901d24ffe308 /core/plugin.rb
parent60b670a3301b0e1b5a47cbc6040a793ea421d888 (diff)
downloadmikutter-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.rb36
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