diff options
Diffstat (limited to 'core/plugin/twitter')
-rw-r--r-- | core/plugin/twitter/.mikutter.yml | 1 | ||||
-rw-r--r-- | core/plugin/twitter/mikutwitter/api_call_support.rb | 2 | ||||
-rw-r--r-- | core/plugin/twitter/model/message.rb | 4 | ||||
-rw-r--r-- | core/plugin/twitter/model/world.rb | 36 | ||||
-rw-r--r-- | core/plugin/twitter/twitter.rb | 129 |
5 files changed, 147 insertions, 25 deletions
diff --git a/core/plugin/twitter/.mikutter.yml b/core/plugin/twitter/.mikutter.yml index 74feec89..b133c97c 100644 --- a/core/plugin/twitter/.mikutter.yml +++ b/core/plugin/twitter/.mikutter.yml @@ -6,5 +6,6 @@ depends: mikutter: '3.6' plugin: - world + - spell version: '1.0' author: toshi_a diff --git a/core/plugin/twitter/mikutwitter/api_call_support.rb b/core/plugin/twitter/mikutwitter/api_call_support.rb index 7dae3e6b..230e8d4d 100644 --- a/core/plugin/twitter/mikutwitter/api_call_support.rb +++ b/core/plugin/twitter/mikutwitter/api_call_support.rb @@ -192,7 +192,7 @@ module MikuTwitter::ApiCallSupport cnv[:recipient] = user(dm[:recipient]) cnv[:exact] = true cnv[:created] = Time.parse(dm[:created_at]).localtime - Mikutter::Twitter::DirectMessage.new_ifnecessary(cnv) end + Plugin::Twitter::DirectMessage.new_ifnecessary(cnv) end def id(id) id end diff --git a/core/plugin/twitter/model/message.rb b/core/plugin/twitter/model/message.rb index 835df09b..ae4e71e2 100644 --- a/core/plugin/twitter/model/message.rb +++ b/core/plugin/twitter/model/message.rb @@ -116,12 +116,14 @@ class Plugin::Twitter::Message < Diva::Model service = Service.primary if retweetable? and service service.retweet(self){|*a| yield(*a) if block_given? } end end + deprecate :retweet, "spell (see: https://reference.mikutter.hachune.net/reference/2017/11/28/spell.html#retweet-twitter-tweet)", 2018, 11 # この投稿を削除する def destroy service = Service.primary if deletable? and service service.destroy(self){|*a| yield(*a) if block_given? } end end + deprecate :destroy, "spell (see: https://reference.mikutter.hachune.net/reference/2017/11/28/spell.html#destroy-twitter-tweet)", 2018, 12 # お気に入り状態を変更する。_fav_ がtrueならお気に入りにし、falseならお気に入りから外す。 def favorite(fav = true) @@ -602,6 +604,7 @@ class Plugin::Twitter::Message < Diva::Model end retweeted_users.include?(world.user_obj) if world.class.slug == :twitter end + deprecate :retweeted?, "spell (see: https://reference.mikutter.hachune.net/reference/2017/11/28/spell.html#retweeted-twitter-tweet)", 2018, 11 # この投稿を「自分」がリツイートしていれば真 def retweeted_by_me?(world = Enumerator.new{|y| Plugin.filtering(:worlds, y) }) @@ -613,6 +616,7 @@ class Plugin::Twitter::Message < Diva::Model retweeted_users.any?(&our.method(:include?)) end end + deprecate :retweeted_by_me?, "spell (see: https://reference.mikutter.hachune.net/reference/2017/11/28/spell.html#retweeted-twitter-tweet)", 2018, 11 # この投稿をリツイート等して、 _me_ のタイムラインに出現させたリツイートを返す。 # 特に誰もリツイートしていない場合は _self_ を返す。 diff --git a/core/plugin/twitter/model/world.rb b/core/plugin/twitter/model/world.rb index 2704841c..368111ba 100644 --- a/core/plugin/twitter/model/world.rb +++ b/core/plugin/twitter/model/world.rb @@ -154,35 +154,19 @@ module Plugin::Twitter service.unfavorite(message).next{ Plugin.call(:unfavorite, service, service.user_obj, base) base } end } + deprecate :favorite, "spell (see: https://reference.mikutter.hachune.net/reference/2017/11/28/spell.html#favorite-twitter-twitter_tweet)", 2018, 12 define_postal :unfavorite def postable?(target=nil) - case target.class.slug - when :twitter_tweet, :twitter_user, :twitter - true - end if target.is_a?(Diva::Model) + Plugin[:twitter].compose?(self, target) end + deprecate :postable?, "spell (see: https://reference.mikutter.hachune.net/reference/2017/11/28/spell.html#compose-twitter)", 2018, 11 def post(to: nil, message:, **kwrest) - first_responder = Array(to).first || self - if defined?(first_responder.class.slug) - case first_responder.class.slug - when nil, :twitter - post_tweet(message: message) - when :twitter_tweet - post_tweet(replyto: first_responder, message: message) - when :twitter_user - post_tweet(receiver: first_responder, message: message) - when :twitter_direct_message - post_dm(user: first_responder.user, text: message) - else - raise "invalid responder slug #{first_responder.class.slug.inspect}" - end - else - raise "invalid responder #{first_responder.inspect}" - end + Plugin[:twitter].compose(self, to, body: message, **kwrest) end + deprecate :post, "spell (see: https://reference.mikutter.hachune.net/reference/2017/11/28/spell.html#compose-twitter)", 2018, 11 def inspect "#<#{self.class.to_s}: #{id.inspect} #{slug.inspect}>" @@ -194,8 +178,11 @@ module Plugin::Twitter result end - private - + # :nodoc: + # 内部で利用するために用意されています。 + # ツイートを投稿したい場合は、 + # https://reference.mikutter.hachune.net/reference/2017/11/28/spell.html#compose-twitter + # を参照してください。 def post_tweet(options) twitter.update(options).next{ |message| Plugin.call(:posted, self, [message]) @@ -204,6 +191,7 @@ module Plugin::Twitter } end + # :nodoc: def post_dm(options) twitter.send_direct_message(options).next do |dm| Plugin.call(:direct_messages, self, [dm]) @@ -211,6 +199,8 @@ module Plugin::Twitter end end + private + def user_initialize if self[:user] self[:user] = Plugin::Twitter::User.new_ifnecessary(self[:user]) diff --git a/core/plugin/twitter/twitter.rb b/core/plugin/twitter/twitter.rb index 10649e55..4b8e74a7 100644 --- a/core/plugin/twitter/twitter.rb +++ b/core/plugin/twitter/twitter.rb @@ -88,6 +88,134 @@ Plugin.create(:twitter) do filter_appear(&gen_message_filter) + defspell(:destroy, :twitter, :twitter_tweet, + condition: ->(twitter, tweet){ tweet.from_me?(twitter) } + ) do |twitter, tweet| + (twitter/"statuses/destroy".freeze/tweet.id).message.next{ |destroyed_tweet| + destroyed_tweet[:rule] = :destroy + Plugin.call(:destroyed, [destroyed_tweet]) + destroyed_tweet + } + end + + defspell(:destroy_retweet, :twitter, :twitter_tweet, + condition: ->(twitter, tweet){ retweeted?(twitter, tweet) } + ) do |twitter, tweet| + retweeted(twitter, tweet).next{ |retweet| + destroy(twitter, retweet) + } + end + + defspell(:favorite, :twitter, :twitter_tweet, + condition: ->(twitter, tweet){ + !favorited?(twitter, tweet) + }) do |twitter, tweet| + Plugin.call(:before_favorite, twitter, twitter.user_obj, tweet) + (twitter/'favorites/create'.freeze).message(id: tweet.id).next{ |favorited_tweet| + Plugin.call(:favorite, twitter, twitter.user_obj, favorited_tweet) + favorited_tweet + }.trap{ |e| + Plugin.call(:fail_favorite, twitter, twitter.user_obj, tweet) + Deferred.fail(e) + } + end + + defspell(:favorited, :twitter, :twitter_tweet, + condition: ->(twitter, tweet){ favorited?(twitter.user_obj, tweet) } + ) do |twitter, tweet| + Delayer::Deferred.new.next{ + favorited?(twitter.user, tweet) + } + end + + defspell(:favorited, :twitter_user, :twitter_tweet, + condition: ->(user, tweet){ tweet.favorited_by.include?(user) } + ) do |user, tweet| + Delayer::Deferred.new.next{ + favorited?(user, tweet) + } + end + + defspell(:compose, :twitter, :twitter_tweet, + condition: ->(twitter, tweet, visibility: nil){ + !(visibility && visibility != :public) + }) do |twitter, tweet, body:, **options| + twitter.post_tweet(message: body, replyto: tweet, **options) + end + + defspell(:compose, :twitter, :twitter_direct_message, + condition: ->(twitter, direct_message, visibility: nil){ + !(visibility && visibility != :direct) + }) do |twitter, direct_message, body:, **options| + twitter.post_dm(user: direct_message.user, text: body, **options) + end + + defspell(:compose, :twitter, :twitter_user, + condition: ->(twitter, user, visibility: nil){ + !(visibility && ![:public, :direct].include?(visibility)) + }) do |twitter, user, visibility: nil, body:, **options| + case visibility + when :public, nil + twitter.post_tweet(message: body, receiver: user, **options) + when :direct + twitter.post_dm(user: user, text: body, **options) + else + raise "invalid visibility `#{visibility.inspect}'." + end + end + + # 宛先なしのタイムラインへのツイートか、 _to_ オプション引数で複数宛てにする場合。 + # Twitterでは複数宛先は対応していないため、 _to_ オプションの1つめの値に対する投稿とする + defspell(:compose, :twitter, + condition: ->(twitter, to: nil){ + first = Array(to).compact.first + !(first && !compose?(twitter, first)) + }) do |twitter, body:, to: nil, **options| + first = Array(to).compact.first + if first + compose(twitter, first, body: body, **options) + else + twitter.post_tweet(to: to, message: body, **options) + end + end + + defspell(:retweet, :twitter, :twitter_tweet, + condition: ->(twitter, tweet){ !tweet.protected? } + ) do |twitter, tweet| + twitter.retweet(id: tweet.id).next{|retweeted| + Plugin.call(:posted, twitter, [retweeted]) + Plugin.call(:update, twitter, [retweeted]) + retweeted + } + end + + defspell(:retweeted, :twitter, :twitter_tweet, + condition: ->(twitter, tweet){ tweet.retweeted_users.include?(twitter.user_obj) } + ) do |twitter, tweet| + Delayer::Deferred.new.next{ + retweet = tweet.retweeted_statuses.find{|rt| rt.user == twitter.user_obj } + if retweet + retweet + else + raise "ReTweet not found." + end + } + end + + defspell(:unfavorite, :twitter, :twitter_tweet, + condition: ->(twitter, tweet){ + favorited?(twitter, tweet) + }) do |twitter, tweet| + (twitter/'favorites/destroy'.freeze).message(id: tweet.id).next{ |unfavorited_tweet| + Plugin.call(:unfavorite, twitter, twitter.user_obj, unfavorited_tweet) + unfavorited_tweet + } + end + + defspell(:search, :twitter) do |twitter, **options| + twitter.search(**options) + end + # リツイートを削除した時、ちゃんとリツイートリストからそれを削除する on_destroyed do |messages| messages.each{ |message| @@ -160,5 +288,4 @@ Plugin.create(:twitter) do builder.build(result[:token]) end - end |