Class: Dispander::Core

Inherits:
Object
  • Object
show all
Includes:
Discorb::Extension
Defined in:
lib/dispander/extension.rb

Constant Summary collapse

@@discord_url_pattern =
/(?!<)https:\/\/(ptb.|canary.)?discord(app)?.com\/channels\/(?<guild>[0-9]{17,})\/(?<channel>[0-9]{17,})\/(?<message>[0-9]{17,})(?!>)/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client, delete_emoji: Discorb::UnicodeEmoji["wastebasket"]) ⇒ Core

Returns a new instance of Core.



9
10
11
12
# File 'lib/dispander/extension.rb', line 9

def initialize(client, delete_emoji: Discorb::UnicodeEmoji["wastebasket"])
  @delete_emoji = delete_emoji
  super(client)
end

Instance Attribute Details

#delete_emojiDiscorb::Emoji

Returns 削除リアクションとして使う絵文字。.

Returns:

  • (Discorb::Emoji)

    削除リアクションとして使う絵文字。



25
26
27
# File 'lib/dispander/extension.rb', line 25

def delete_emoji
  @delete_emoji
end

Instance Method Details

#create_embed_from_attachment(attachment) ⇒ Discorb::Embed

添付ファイルから埋め込みを作成します。

Parameters:

  • attachment (Discorb::Attachment)

    埋め込みを作成する添付ファイル。

Returns:

  • (Discorb::Embed)

    埋め込み。



100
101
102
103
104
105
# File 'lib/dispander/extension.rb', line 100

def create_embed_from_attachment(attachment)
  embed = Discorb::Embed.new(
    image: attachment.proxy_url,
  )
  embed
end

#create_embed_from_message(message) ⇒ Discorb::Embed

メッセージから埋め込みを作成します。

Parameters:

  • message (Discorb::Message)

    埋め込みを作成するメッセージ。

Returns:

  • (Discorb::Embed)

    埋め込み。



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/dispander/extension.rb', line 76

def create_embed_from_message(message)
  embed = Discorb::Embed.new
  embed.description = message.content
  embed.timestamp = message.timestamp
  embed.author = Discorb::Embed::Author.new(
    message.author.to_s,
    icon: message.author.avatar.url,
  )
  embed.footer = Discorb::Embed::Footer.new(
    "#" + message.channel.name
  )
  if (attachment = message.attachments[0]) && attachment.image?
    embed.image = attachment.proxy_url
  end
  embed
end

#delete_message(event) ⇒ Object

埋め込みを削除します。

Parameters:

  • event (Discorb::Gateway::ReactionEvent)

    リアクションのイベント。



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/dispander/extension.rb', line 112

def delete_message(event)
  return unless event.emoji == @delete_emoji
  return if event.user_id == @client.user.id

  message = event.fetch_message.wait

  return if message.embeds.empty?
  return unless message.author == @client.user

  _, author_id, operator_id, sent_message_ids = *message.embed.url.match(/^http:\/\/a.io\/([0-9]+)-([0-9]+)-([0-9,]+)$/)
  return unless author_id == event.user_id || operator_id == event.user_id

  sent_message_ids.split(",").each do |sent_message_id|
    event.channel.delete_message(sent_message_id).wait
  end
end

#dispand(base_message) ⇒ Array<Discorb::Message>

メッセージを解析して、埋め込みを送信します。

Parameters:

  • base_message (Discorb::Message)

    解析するメッセージ。

Returns:

  • (Array<Discorb::Message>)

    埋め込みを送信したメッセージ。



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/dispander/extension.rb', line 34

def dispand(base_message)
  all_sent_messages = []
  base_message.content.scan(@@discord_url_pattern).each do |match|
    guild_id, channel_id, message_id = *match
    next unless should_expand?(base_message, [guild_id, channel_id, message_id])

    embeds = []

    sent_messages = []
    begin
      next unless guild = @client.guilds[guild_id]
      next unless channel = guild.channels[channel_id] || @client.fetch_channel(channel_id).wait
      next unless message = channel.fetch_message(message_id).wait
    rescue Discorb::NotFoundError, NoMethodError
      next
    else
      embed = create_embed_from_message(message)
      embeds << embed
      embeds += message.embeds
      embeds += message.attachments[1..]&.filter(&:image?)&.map { |attachment| create_embed_from_attachment(attachment) }.to_a

      until (embeds_send = embeds.slice!(..10)).empty?
        sent_messages << base_message.channel.post(embeds: embeds_send).wait
      end
      embed.url = "http://a.io/#{base_message.author.id}-#{message.author.id}-#{sent_messages.map(&:id).join(",")}"
      first_embeds = sent_messages[0].embeds
      first_embeds[0] = embed
      sent_messages[0].add_reaction(@delete_emoji)
      sent_messages[0].edit(embeds: first_embeds).wait
      all_sent_messages += sent_messages
    end
  end
  all_sent_messages
end

#should_expand?(base_message, ids) ⇒ Boolean

メッセージを展開するかどうか。 デフォルトでは同じサーバーのみ展開されます。 このメソッドをオーバーライドすることにより、条件を変更することができます。

Returns:

  • (Boolean)

    展開する場合は `true`、展開しない場合は `false`。



139
140
141
# File 'lib/dispander/extension.rb', line 139

def should_expand?(base_message, ids)
  base_message.guild.id == ids[0]
end