forked from yagich/potomark-bot-rb
		
	
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
require 'dotenv/load'
 | 
						|
require 'discordrb'
 | 
						|
 | 
						|
bot = Discordrb::Bot.new token: ENV['DISCORD_TOKEN']
 | 
						|
 | 
						|
BOOKMARK_EMOJI = '🔖'
 | 
						|
PIN_EMOJI = '📌'
 | 
						|
 | 
						|
TRIM_MESSAGE_LENGTH = 500
 | 
						|
 | 
						|
$sentence = {}
 | 
						|
 | 
						|
bot.reaction_add do |event|
 | 
						|
  next unless [BOOKMARK_EMOJI, PIN_EMOJI].include? event.emoji.name
 | 
						|
 | 
						|
  if(event.emoji.name == BOOKMARK_EMOJI)
 | 
						|
    # extract data of the message's author
 | 
						|
    message_author = event.message.author
 | 
						|
    message_author_pfp = message_author.avatar_url 'png'
 | 
						|
    message_author_nickname = message_author.display_name
 | 
						|
    message_author_distinct = message_author.distinct
 | 
						|
 | 
						|
    message_author_fname = "#{message_author_nickname} (#{message_author_distinct})" # this is the 'author' field of the embed
 | 
						|
 | 
						|
    trimmed_msg = "#{event.message.content[0..TRIM_MESSAGE_LENGTH]}#{'...' if event.message.content.length > TRIM_MESSAGE_LENGTH}" # trim the string to TRIM_MESSAGE_LENGTH chars max to not make the embed too huge
 | 
						|
    if trimmed_msg.empty?
 | 
						|
      trimmed_msg = "<empty>"
 | 
						|
    end
 | 
						|
    original_msg_link = event.message.link
 | 
						|
 | 
						|
    pm = event.user.pm
 | 
						|
 | 
						|
    pm.send_embed 'Bookmark created!' do |embed|
 | 
						|
      embed.title = 'Go to message'
 | 
						|
      embed.url = original_msg_link
 | 
						|
      embed.author = Discordrb::Webhooks::EmbedAuthor.new(icon_url: message_author_pfp, name: message_author_fname)
 | 
						|
      embed << Discordrb::Webhooks::EmbedField.new(name: 'Message (trimmed)', value: trimmed_msg)
 | 
						|
      if !event.message.attachments.empty?
 | 
						|
        event.message.attachments.each_index do |idx|
 | 
						|
          attachment = event.message.attachments[idx]
 | 
						|
          embed << Discordrb::Webhooks::EmbedField.new(name: "Attachment \##{idx + 1}", value: attachment.url)
 | 
						|
        end
 | 
						|
      end
 | 
						|
      embed.timestamp = event.message.timestamp
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  if(event.emoji.name == PIN_EMOJI)
 | 
						|
    event.message.pin unless event.message.reactions.include? PIN_EMOJI
 | 
						|
  end
 | 
						|
 | 
						|
  nil # `event` is of type Respondable, so the return line of the block needs to be nil to prevent the bot sending something in the chhannel the reaction occured.
 | 
						|
end
 | 
						|
 | 
						|
bot.reaction_remove do |event|
 | 
						|
  next unless event.emoji.name == PIN_EMOJI
 | 
						|
  pin_reactions = event.message.reactions.filter {|el| el.name == PIN_EMOJI}
 | 
						|
  event.message.unpin if pin_reactions.empty?
 | 
						|
  nil
 | 
						|
end
 | 
						|
 | 
						|
bot.message(in: Integer(ENV['SENTENCE_CHANNEL'])) do |event|
 | 
						|
  if ['?', '!', '.', '...', '?!'].include? event.message.content
 | 
						|
    if $sentence.empty?
 | 
						|
      next
 | 
						|
    end
 | 
						|
    event << "Congratulations, your sentence is: #{$sentence.values.join(" ").gsub(/\s([^\w\s])/, '\1')}#{event.message.content}"
 | 
						|
    $sentence.clear
 | 
						|
    next
 | 
						|
  end
 | 
						|
 | 
						|
  $sentence[event.message.id] = event.message.content
 | 
						|
end
 | 
						|
 | 
						|
bot.message_delete(in: Integer(ENV['SENTENCE_CHANNEL'])) do |event|
 | 
						|
  $sentence.delete(event.id)
 | 
						|
end
 | 
						|
 | 
						|
bot.message_edit(in: Integer(ENV['SENTENCE_CHANNEL'])) do |event|
 | 
						|
  $sentence[event.message.id] = event.message.content
 | 
						|
end
 | 
						|
 | 
						|
bot.run
 |