aboutsummaryrefslogtreecommitdiffstats
path: root/core/plugin/twitter
diff options
context:
space:
mode:
Diffstat (limited to 'core/plugin/twitter')
-rw-r--r--core/plugin/twitter/.mikutter.yml1
-rw-r--r--core/plugin/twitter/mikutwitter/api_call_support.rb2
-rw-r--r--core/plugin/twitter/model/message.rb4
-rw-r--r--core/plugin/twitter/model/world.rb36
-rw-r--r--core/plugin/twitter/twitter.rb129
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