2014/07/30

[Mikutter] イベント定義を試した

イベントを定義したい

リストに所属している人のツイートがあった場合に発火するイベントが欲しくなったので、勉強がてら作って見る。

イベント定義の手順

  1. defevent で下記項目を定義
    • イベント名
    • 優先度
    • 引数の型
  2. Plugin.call(イベント名, 引数) でイベント発火

これだけ。

確認用コード

.mikutter.yml

---
slug: :studyEvent
depends:
  mikutter: 3.0.3
  plugin: []
version: '1.0'
author: 
name: studyEvent
description: イベントの勉強。

studyEvent.rb

# -*- coding: utf-8 -*-

Plugin.create(:studyEvent) do
    defevent :list_tweet_receive,  priority: :routine_passive, prototype: [UserList, Message]

    onboot do |service|
        Open3.capture3("echo 'start' > ~/tmp/ttt.txt")
    end

    # リストのツイート受信毎に list_tweet_receive イベントを発行する
    on_appear do |messages|
        messages.each{ |message|
            Plugin[:list].timelines.each{ |slug, list|
                if list.related?(message)
                    Plugin.call(:list_tweet_receive, list, message)
                end
            }
        }
    end

    # イベント発火をトリガに処理を行う
    on_list_tweet_receive do |list, message|
        Open3.capture3("echo '#{list.user}/#{list[:name]}' >> ~/tmp/ttt.txt")
        if list.user === 'mikoto2000' && list[:name] === 'News' then
            Open3.capture3("echo '#{message}' >> ~/tmp/ttt.txt")
        end
    end
end

イベント発火の部分だけ抜き出すと以下な感じか?

# -*- coding: utf-8 -*-

Plugin.create(:studyEvent) do
    defevent :list_tweet_receive,  priority: :routine_passive, prototype: [UserList, Message]

    # リストのツイート受信毎に list_tweet_receive イベントを発行する
    on_appear do |messages|
        messages.each{ |message|
            Plugin[:list].timelines.each{ |slug, list|
                if list.related?(message)
                    Plugin.call(:list_tweet_receive, list, message)
                end
            }
        }
    end
end

「リストイベントを追加するプラグイン」として単体で提供して、 このイベントが欲しかったら依存関係に入れろみたいな感じでどうか?

依存関係に入れなくても、プラグインが入っている時だけリスト系の機能が使えます的な使い方できるか?

-> 公開した。

mikoto2000/mikutter-list-event : https://github.com/mikoto2000/mikutter-list-event

0 件のコメント: