elephrame 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/README.md +2 -1
- data/elephrame.gemspec +2 -3
- data/lib/elephrame/bot.rb +3 -3
- data/lib/elephrame/streaming/bots.rb +1 -5
- data/lib/elephrame/streaming/command.rb +108 -0
- data/lib/elephrame/streaming/interaction.rb +61 -0
- data/lib/elephrame/streaming/reply.rb +93 -0
- data/lib/elephrame/streaming/streaming.rb +4 -237
- data/lib/elephrame/version.rb +1 -1
- metadata +8 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 443a61168b9ae56b414840dc0390ede87a9f8c5ea8b6a1c2cdac99ee6d69801e
         | 
| 4 | 
            +
              data.tar.gz: 174eca80ecec2f12d20de89963bc1ae7db831fa58912d202e730d5c7717011e9
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 6e5d3401b5b81ea38c65f568bea40e95717db38d3fc228cebbd6aec97281341300945ede38bcacacd26b5dcbd049478f4c2515a8da7d51eefbff04da658de84c
         | 
| 7 | 
            +
              data.tar.gz: 81c1877dd775d094ff19497d17f770f2eac003f39980557062d9a664c2ba62a5f600625108ba214bc4187207fdbaf0a0d3cbe39575aea968921ef10f6127c4b1
         | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                elephrame (0.4. | 
| 4 | 
            +
                elephrame (0.4.2)
         | 
| 5 5 | 
             
                  moostodon (~> 0.2.0)
         | 
| 6 6 | 
             
                  rufus-scheduler
         | 
| 7 7 |  | 
| @@ -33,7 +33,7 @@ GEM | |
| 33 33 | 
             
                  buftok (~> 0)
         | 
| 34 34 | 
             
                  http (~> 3.0)
         | 
| 35 35 | 
             
                  oj (~> 3.3)
         | 
| 36 | 
            -
                oj (3.7 | 
| 36 | 
            +
                oj (3.6.7)
         | 
| 37 37 | 
             
                public_suffix (3.0.3)
         | 
| 38 38 | 
             
                raabro (1.1.6)
         | 
| 39 39 | 
             
                rake (10.5.0)
         | 
    
        data/README.md
    CHANGED
    
    | @@ -69,7 +69,8 @@ Exposed methods from bot object: | |
| 69 69 | 
             
            - `max_retries` (defaults to 5) the maximum amount of times the framework will retry a mastodon request
         | 
| 70 70 | 
             
            - `failed` a hash that represents the status of the last post or media upload. `failed[:post]` and `failed[:media]`; returns true if it failed, false if it succeeded 
         | 
| 71 71 | 
             
            - `post(content, visibility: 'unlisted', spoiler: '', reply_id: '', hide_media: false, media: [])` this provides an easy way to post statuses from inside code blocks
         | 
| 72 | 
            -
            - `reply(content, *options)` a shorthand method to reply to the last mention (Note:  | 
| 72 | 
            +
            - `reply(content, *options)` a shorthand method to reply to the last mention (Note: only include the @ for the user who @ed the bot)
         | 
| 73 | 
            +
            - `reply_with_mentions(content, *options)` similar to `reply` but includes all @s (respects #NoBot)
         | 
| 73 74 | 
             
            - `find_ancestor(id, depth = 10, stop_at = 1)` looks backwards through reply chains for the most recent post the bot made starting at post `id` until it hits `depth` number of posts, or finds `stop_at` number of it's own posts
         | 
| 74 75 | 
             
            - `no_bot?(account_id)` returns true if user with `account_id` has some form of "#NoBot" in their bio 
         | 
| 75 76 |  | 
    
        data/elephrame.gemspec
    CHANGED
    
    | @@ -20,6 +20,7 @@ Gem::Specification.new do |spec| | |
| 20 20 |  | 
| 21 21 | 
             
                spec.metadata["homepage_uri"] = spec.homepage
         | 
| 22 22 | 
             
                spec.metadata["source_code_uri"] = spec.homepage
         | 
| 23 | 
            +
                spec.metadata["changelog_uri"] = "https://github.com/theZacAttacks/elephrame/releases"
         | 
| 23 24 | 
             
              else
         | 
| 24 25 | 
             
                raise "RubyGems 2.0 or newer is required to protect against " \
         | 
| 25 26 | 
             
                  "public gem pushes."
         | 
| @@ -34,13 +35,11 @@ Gem::Specification.new do |spec| | |
| 34 35 | 
             
              spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         | 
| 35 36 | 
             
              spec.require_paths = ["lib"]
         | 
| 36 37 |  | 
| 38 | 
            +
              spec.required_ruby_version = '~> 2.0'
         | 
| 37 39 | 
             
              spec.add_development_dependency "bundler", "~> 1.17"
         | 
| 38 40 | 
             
              spec.add_development_dependency "rake", "~> 10.0"
         | 
| 39 41 | 
             
              spec.add_development_dependency "minitest", "~> 5.0"
         | 
| 40 42 |  | 
| 41 43 | 
             
              spec.add_dependency 'rufus-scheduler'
         | 
| 42 44 | 
             
              spec.add_dependency 'moostodon', '~> 0.2.0'
         | 
| 43 | 
            -
              
         | 
| 44 | 
            -
              # until mastodon-api gets a bump this stays commented out
         | 
| 45 | 
            -
              #spec.add_dependency 'mastodon-api', '> 1.1.0'
         | 
| 46 45 | 
             
            end
         | 
    
        data/lib/elephrame/bot.rb
    CHANGED
    
    | @@ -1,4 +1,3 @@ | |
| 1 | 
            -
            require 'time'
         | 
| 2 1 | 
             
            require 'net/http'
         | 
| 3 2 |  | 
| 4 3 | 
             
            module Elephrame  
         | 
| @@ -6,7 +5,7 @@ module Elephrame | |
| 6 5 |  | 
| 7 6 | 
             
                ##
         | 
| 8 7 | 
             
                # a superclass for other bots
         | 
| 9 | 
            -
                # holds common  | 
| 8 | 
            +
                # holds common methods and variables
         | 
| 10 9 |  | 
| 11 10 | 
             
                class BaseBot
         | 
| 12 11 | 
             
                  attr_reader :client, :username, :failed
         | 
| @@ -115,7 +114,8 @@ module Elephrame | |
| 115 114 | 
             
                        block.call
         | 
| 116 115 | 
             
                        return false
         | 
| 117 116 | 
             
                      rescue HTTP::TimeoutError
         | 
| 118 | 
            -
                        puts "caught HTTP Timeout error  | 
| 117 | 
            +
                        puts "caught HTTP Timeout error; retrying #{@max_retries-i} more times"
         | 
| 118 | 
            +
                        sleep 5
         | 
| 119 119 | 
             
                      end
         | 
| 120 120 | 
             
                    end
         | 
| 121 121 | 
             
                    return true
         | 
| @@ -0,0 +1,108 @@ | |
| 1 | 
            +
            module Elephrame
         | 
| 2 | 
            +
              module Command
         | 
| 3 | 
            +
                include Elephrame::Reply
         | 
| 4 | 
            +
                
         | 
| 5 | 
            +
                attr_reader :commands, :prefix
         | 
| 6 | 
            +
                attr :cmd_hash, :cmd_regex, :not_found
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                ##
         | 
| 9 | 
            +
                # Initializes the +commands+ array, +cmd_hash+ 
         | 
| 10 | 
            +
                #
         | 
| 11 | 
            +
                # @param prefix [String] sets the command prefix, defaults to '!'
         | 
| 12 | 
            +
                # @param usage [String] the response to the help command
         | 
| 13 | 
            +
                # 
         | 
| 14 | 
            +
                
         | 
| 15 | 
            +
                def setup_command(prefix = '!', usage = nil)
         | 
| 16 | 
            +
                    @commands = []
         | 
| 17 | 
            +
                    @cmd_hash = {}
         | 
| 18 | 
            +
                    
         | 
| 19 | 
            +
                    set_prefix prefix
         | 
| 20 | 
            +
                    set_help usage unless usage.nil?
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                ##
         | 
| 24 | 
            +
                # sets the prefix for commands
         | 
| 25 | 
            +
                #
         | 
| 26 | 
            +
                # @param pf [String] the prefix
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                def set_prefix pf
         | 
| 29 | 
            +
                  @prefix = pf
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                ##
         | 
| 33 | 
            +
                # Shortcut method to provide usage docs in response to help command
         | 
| 34 | 
            +
                #
         | 
| 35 | 
            +
                # @param usage [String] 
         | 
| 36 | 
            +
                
         | 
| 37 | 
            +
                def set_help usage
         | 
| 38 | 
            +
                  add_command 'help' do |bot, content, status|
         | 
| 39 | 
            +
                    bot.reply("#{usage}")
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                ##
         | 
| 44 | 
            +
                # Adds the command and block into the bot to process later
         | 
| 45 | 
            +
                # also sets up the command regex
         | 
| 46 | 
            +
                #
         | 
| 47 | 
            +
                # @param cmd [String] a command to add
         | 
| 48 | 
            +
                # @param block [Proc] the code to execute when +cmd+ is recieved
         | 
| 49 | 
            +
                
         | 
| 50 | 
            +
                def add_command cmd, &block
         | 
| 51 | 
            +
                  @commands.append cmd unless @commands.include? cmd
         | 
| 52 | 
            +
                  @cmd_hash[cmd.to_sym] = block
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  # build up our regex (this regex should be fine, i guess :shrug:)
         | 
| 55 | 
            +
                  @cmd_regex = /\A#{@prefix}(?<cmd>#{@commands.join('|')})\b(?<data>.*)/m
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                ##
         | 
| 59 | 
            +
                # What to do if we don't match anything
         | 
| 60 | 
            +
                #
         | 
| 61 | 
            +
                # @param block [Proc] a block to run when we don't match a command
         | 
| 62 | 
            +
                
         | 
| 63 | 
            +
                def if_not_found &block
         | 
| 64 | 
            +
                  @not_found = block
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                ##
         | 
| 68 | 
            +
                # Starts loop to process any mentions, running command procs set up earlier
         | 
| 69 | 
            +
                #
         | 
| 70 | 
            +
                # If a block is passed to this function it gets ran when no commands
         | 
| 71 | 
            +
                # get matched. Otherwise the framework checks if +not_found+ exists
         | 
| 72 | 
            +
                # and runs it
         | 
| 73 | 
            +
                
         | 
| 74 | 
            +
                def run_commands
         | 
| 75 | 
            +
                  @streamer.user do |update|
         | 
| 76 | 
            +
                    next unless update.kind_of? Mastodon::Notification and update.type == 'mention'
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                    # set up the status to strip html, if needed
         | 
| 79 | 
            +
                    update.status.class
         | 
| 80 | 
            +
                      .module_eval { alias_method :content, :strip } if @strip_html
         | 
| 81 | 
            +
                    store_mention_data update.status
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                    # strip our username out of the status
         | 
| 84 | 
            +
                    post = update.status.content.gsub(/@#{@username} /, '')
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                    # see if the post matches our regex, running the stored proc if it does
         | 
| 87 | 
            +
                    matches = @cmd_regex.match(post)
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                    unless matches.nil?
         | 
| 90 | 
            +
                      @cmd_hash[matches[:cmd].to_sym]
         | 
| 91 | 
            +
                        .call(self,
         | 
| 92 | 
            +
                              matches[:data].strip,
         | 
| 93 | 
            +
                              update.status)
         | 
| 94 | 
            +
                    else
         | 
| 95 | 
            +
                      
         | 
| 96 | 
            +
                      if block_given?
         | 
| 97 | 
            +
                        yield(self, update.status)
         | 
| 98 | 
            +
                      else
         | 
| 99 | 
            +
                        @not_found.call(self, update.status) unless @not_found.nil?
         | 
| 100 | 
            +
                      end
         | 
| 101 | 
            +
                      
         | 
| 102 | 
            +
                    end
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                alias_method :run, :run_commands
         | 
| 107 | 
            +
              end
         | 
| 108 | 
            +
            end
         | 
| @@ -0,0 +1,61 @@ | |
| 1 | 
            +
            module Elephrame
         | 
| 2 | 
            +
              module AllInteractions
         | 
| 3 | 
            +
                include Elephrame::Reply
         | 
| 4 | 
            +
                attr :on_fave, :on_boost, :on_follow
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                ##
         | 
| 7 | 
            +
                # Sets on_fave equal to +block+
         | 
| 8 | 
            +
                
         | 
| 9 | 
            +
                def on_fave &block
         | 
| 10 | 
            +
                  @on_fave = block
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                ##
         | 
| 14 | 
            +
                # Sets on_boost to +block+
         | 
| 15 | 
            +
                
         | 
| 16 | 
            +
                def on_boost &block
         | 
| 17 | 
            +
                  @on_boost = block
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                ##
         | 
| 21 | 
            +
                # Sets on_follow to +block+
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                def on_follow &block
         | 
| 24 | 
            +
                  @on_follow = block
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                ##
         | 
| 28 | 
            +
                # Starts a loop that checks for any notifications for the authenticated
         | 
| 29 | 
            +
                # user, running the appropriate stored proc when needed
         | 
| 30 | 
            +
                
         | 
| 31 | 
            +
                def run_interact
         | 
| 32 | 
            +
                  @streamer.user do |update|
         | 
| 33 | 
            +
                    if update.kind_of? Mastodon::Notification
         | 
| 34 | 
            +
                      
         | 
| 35 | 
            +
                      case update.type
         | 
| 36 | 
            +
                          
         | 
| 37 | 
            +
                      when 'mention'
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                        # this makes it so .content calls strip instead 
         | 
| 40 | 
            +
                        update.status.class.module_eval { alias_method :content, :strip } if @strip_html
         | 
| 41 | 
            +
                        store_mention_data update.status
         | 
| 42 | 
            +
                        @on_reply.call(self, update.status) unless @on_reply.nil?
         | 
| 43 | 
            +
                        
         | 
| 44 | 
            +
                      when 'reblog'
         | 
| 45 | 
            +
                        @on_boost.call(self, update) unless @on_boost.nil?
         | 
| 46 | 
            +
                        
         | 
| 47 | 
            +
                      when 'favourite'
         | 
| 48 | 
            +
                        @on_fave.call(self, update) unless @on_fave.nil?
         | 
| 49 | 
            +
                        
         | 
| 50 | 
            +
                      when 'follow'
         | 
| 51 | 
            +
                        @on_follow.call(self, update) unless @on_follow.nil?
         | 
| 52 | 
            +
                        
         | 
| 53 | 
            +
                      end
         | 
| 54 | 
            +
                    end
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                
         | 
| 59 | 
            +
                alias_method :run, :run_interact
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
            end
         | 
| @@ -0,0 +1,93 @@ | |
| 1 | 
            +
            module Elephrame
         | 
| 2 | 
            +
              module Reply
         | 
| 3 | 
            +
                attr :on_reply, :mention_data
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                ##
         | 
| 6 | 
            +
                # Sets on_reply equal to +block+
         | 
| 7 | 
            +
                
         | 
| 8 | 
            +
                def on_reply &block
         | 
| 9 | 
            +
                  @on_reply = block
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                ##
         | 
| 13 | 
            +
                # Replies to the last mention the bot recieved using the mention's
         | 
| 14 | 
            +
                #   visibility and spoiler with +text+
         | 
| 15 | 
            +
                #
         | 
| 16 | 
            +
                # Automatically includes an @ for the account that mentioned the bot.
         | 
| 17 | 
            +
                #   Does not include any other @. See +reply_with_mentions+ if you want
         | 
| 18 | 
            +
                #   to automatically include all mentions
         | 
| 19 | 
            +
                #
         | 
| 20 | 
            +
                # @param text [String] text to post as a reply
         | 
| 21 | 
            +
                # @param options [Hash] a hash of arguments to pass to post, overrides
         | 
| 22 | 
            +
                #   duplicating settings from last mention 
         | 
| 23 | 
            +
                
         | 
| 24 | 
            +
                def reply(text, *options)
         | 
| 25 | 
            +
                  options = Hash[*options]
         | 
| 26 | 
            +
                  
         | 
| 27 | 
            +
                  post("@#{@mention_data[:account].acct} #{text}",
         | 
| 28 | 
            +
                       **@mention_data.merge(options).reject { |k|
         | 
| 29 | 
            +
                         k == :mentions or k == :account
         | 
| 30 | 
            +
                       })
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                ##
         | 
| 34 | 
            +
                # Replies to the last post and tags everyone who was mentioned
         | 
| 35 | 
            +
                #  (this function respects #NoBot)
         | 
| 36 | 
            +
                #
         | 
| 37 | 
            +
                # @param text [String] text to post as a reply
         | 
| 38 | 
            +
                # @param options [Hash] arguments to pass to post, overrides settings from
         | 
| 39 | 
            +
                #  last mention
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def reply_with_mentions(text, *options)
         | 
| 42 | 
            +
                  # build up a string of all accounts mentioned in the post
         | 
| 43 | 
            +
                  #  unless that account is our own, or the tagged account
         | 
| 44 | 
            +
                  #  has #NoBot
         | 
| 45 | 
            +
                  mentions = @mention_data[:mentions].collect do |m|
         | 
| 46 | 
            +
                    "@#{m.acct}" unless m.acct == @username or no_bot? m.id
         | 
| 47 | 
            +
                  end.join ' '
         | 
| 48 | 
            +
                  
         | 
| 49 | 
            +
                  reply("#{mentions.strip} #{text}", *options)
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                ##
         | 
| 53 | 
            +
                # Starts a loop that checks for mentions from the authenticated user account
         | 
| 54 | 
            +
                # running a supplied block or, if a block is not provided, on_reply
         | 
| 55 | 
            +
                
         | 
| 56 | 
            +
                def run_reply
         | 
| 57 | 
            +
                  @streamer.user do |update|
         | 
| 58 | 
            +
                    next unless update.kind_of? Mastodon::Notification and update.type == 'mention'
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    # this makes it so .content calls strip instead 
         | 
| 61 | 
            +
                    update.status.class.module_eval { alias_method :content, :strip } if @strip_html
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    store_mention_data update.status
         | 
| 64 | 
            +
                    
         | 
| 65 | 
            +
                    if block_given?
         | 
| 66 | 
            +
                      yield(self, update.status)
         | 
| 67 | 
            +
                    else
         | 
| 68 | 
            +
                      @on_reply.call(self, update.status)
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                alias_method :run, :run_reply
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                private
         | 
| 76 | 
            +
                
         | 
| 77 | 
            +
                ##
         | 
| 78 | 
            +
                # Stores select data about a post into a hash for later use
         | 
| 79 | 
            +
                #
         | 
| 80 | 
            +
                # @param mention [Mastodon::Status] the most recent mention the bot received
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                def store_mention_data(mention)
         | 
| 83 | 
            +
                  @mention_data = {
         | 
| 84 | 
            +
                    reply_id: mention.id,
         | 
| 85 | 
            +
                    visibility: mention.visibility,
         | 
| 86 | 
            +
                    spoiler: mention.spoiler_text,
         | 
| 87 | 
            +
                    hide_media: mention.sensitive?,
         | 
| 88 | 
            +
                    mentions: mention.mentions,
         | 
| 89 | 
            +
                    account: mention.account
         | 
| 90 | 
            +
                  }
         | 
| 91 | 
            +
                end
         | 
| 92 | 
            +
              end
         | 
| 93 | 
            +
            end
         | 
| @@ -1,3 +1,7 @@ | |
| 1 | 
            +
            require_relative 'reply'
         | 
| 2 | 
            +
            require_relative 'command'
         | 
| 3 | 
            +
            require_relative 'interaction'
         | 
| 4 | 
            +
             | 
| 1 5 | 
             
            module Elephrame
         | 
| 2 6 | 
             
              module Streaming
         | 
| 3 7 | 
             
                attr :streamer
         | 
| @@ -11,241 +15,4 @@ module Elephrame | |
| 11 15 | 
             
                end
         | 
| 12 16 |  | 
| 13 17 | 
             
              end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
              
         | 
| 16 | 
            -
              module Reply
         | 
| 17 | 
            -
                attr :on_reply, :mention_data
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                ##
         | 
| 20 | 
            -
                # Sets on_reply equal to +block+
         | 
| 21 | 
            -
                
         | 
| 22 | 
            -
                def on_reply &block
         | 
| 23 | 
            -
                  @on_reply = block
         | 
| 24 | 
            -
                end
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                ##
         | 
| 27 | 
            -
                # Replies to the last mention the bot recieved using the mention's
         | 
| 28 | 
            -
                #   visibility and spoiler with +text+
         | 
| 29 | 
            -
                #
         | 
| 30 | 
            -
                # Automatically includes an @ for the account that mentioned the bot.
         | 
| 31 | 
            -
                #   Does not include any other @. See +reply_with_mentions+ if you want
         | 
| 32 | 
            -
                #   to automatically include all mentions
         | 
| 33 | 
            -
                #
         | 
| 34 | 
            -
                # @param text [String] text to post as a reply
         | 
| 35 | 
            -
                # @param options [Hash] a hash of arguments to pass to post, overrides
         | 
| 36 | 
            -
                #   duplicating settings from last mention 
         | 
| 37 | 
            -
                
         | 
| 38 | 
            -
                def reply(text, *options)
         | 
| 39 | 
            -
                  options = Hash[*options]
         | 
| 40 | 
            -
                  
         | 
| 41 | 
            -
                  post("@#{@mention_data[:account].acct} #{text}",
         | 
| 42 | 
            -
                       **@mention_data.merge(options).reject { |k|
         | 
| 43 | 
            -
                         k == :mentions or k == :account
         | 
| 44 | 
            -
                       })
         | 
| 45 | 
            -
                end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                ##
         | 
| 48 | 
            -
                # Replies to the last post and tags everyone who was mentioned
         | 
| 49 | 
            -
                #  (this function respects #NoBot)
         | 
| 50 | 
            -
                #
         | 
| 51 | 
            -
                # @param text [String] text to post as a reply
         | 
| 52 | 
            -
                # @param options [Hash] arguments to pass to post, overrides settings from
         | 
| 53 | 
            -
                #  last mention
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                def reply_with_mentions(text, *options)
         | 
| 56 | 
            -
                  # build up a string of all accounts mentioned in the post
         | 
| 57 | 
            -
                  #  unless that account is our own, or the tagged account
         | 
| 58 | 
            -
                  #  has #NoBot
         | 
| 59 | 
            -
                  mentions = @mention_data[:mentions].collect do |m|
         | 
| 60 | 
            -
                    "@#{m.acct}" unless m.acct == @username or no_bot? m.id
         | 
| 61 | 
            -
                  end.join ' '
         | 
| 62 | 
            -
                  
         | 
| 63 | 
            -
                  reply("#{mentions.strip} #{text}", *options)
         | 
| 64 | 
            -
                end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                ##
         | 
| 67 | 
            -
                # Starts a loop that checks for mentions from the authenticated user account
         | 
| 68 | 
            -
                # running a supplied block or, if a block is not provided, on_reply
         | 
| 69 | 
            -
                
         | 
| 70 | 
            -
                def run_reply
         | 
| 71 | 
            -
                  @streamer.user do |update|
         | 
| 72 | 
            -
                    next unless update.kind_of? Mastodon::Notification and update.type == 'mention'
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                    # this makes it so .content calls strip instead 
         | 
| 75 | 
            -
                    update.status.class.module_eval { alias_method :content, :strip } if @strip_html
         | 
| 76 | 
            -
             | 
| 77 | 
            -
                    store_mention_data update.status
         | 
| 78 | 
            -
                    
         | 
| 79 | 
            -
                    if block_given?
         | 
| 80 | 
            -
                      yield(self, update.status)
         | 
| 81 | 
            -
                    else
         | 
| 82 | 
            -
                      @on_reply.call(self, update.status)
         | 
| 83 | 
            -
                    end
         | 
| 84 | 
            -
                  end
         | 
| 85 | 
            -
                end
         | 
| 86 | 
            -
             | 
| 87 | 
            -
                alias_method :run, :run_reply
         | 
| 88 | 
            -
             | 
| 89 | 
            -
                private
         | 
| 90 | 
            -
                
         | 
| 91 | 
            -
                ##
         | 
| 92 | 
            -
                # Stores select data about a post into a hash for later use
         | 
| 93 | 
            -
                #
         | 
| 94 | 
            -
                # @param mention [Mastodon::Status] the most recent mention the bot received
         | 
| 95 | 
            -
             | 
| 96 | 
            -
                def store_mention_data(mention)
         | 
| 97 | 
            -
                  @mention_data = {
         | 
| 98 | 
            -
                    reply_id: mention.id,
         | 
| 99 | 
            -
                    visibility: mention.visibility,
         | 
| 100 | 
            -
                    spoiler: mention.spoiler_text,
         | 
| 101 | 
            -
                    hide_media: mention.sensitive?,
         | 
| 102 | 
            -
                    mentions: mention.mentions,
         | 
| 103 | 
            -
                    account: mention.account
         | 
| 104 | 
            -
                  }
         | 
| 105 | 
            -
                end
         | 
| 106 | 
            -
              end
         | 
| 107 | 
            -
              
         | 
| 108 | 
            -
             | 
| 109 | 
            -
              module AllInteractions
         | 
| 110 | 
            -
                include Elephrame::Reply
         | 
| 111 | 
            -
                attr :on_fave, :on_boost, :on_follow
         | 
| 112 | 
            -
             | 
| 113 | 
            -
                ##
         | 
| 114 | 
            -
                # Sets on_fave equal to +block+
         | 
| 115 | 
            -
                
         | 
| 116 | 
            -
                def on_fave &block
         | 
| 117 | 
            -
                  @on_fave = block
         | 
| 118 | 
            -
                end
         | 
| 119 | 
            -
             | 
| 120 | 
            -
                ##
         | 
| 121 | 
            -
                # Sets on_boost to +block+
         | 
| 122 | 
            -
                
         | 
| 123 | 
            -
                def on_boost &block
         | 
| 124 | 
            -
                  @on_boost = block
         | 
| 125 | 
            -
                end
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                ##
         | 
| 128 | 
            -
                # Sets on_follow to +block+
         | 
| 129 | 
            -
                
         | 
| 130 | 
            -
                def on_follow &block
         | 
| 131 | 
            -
                  @on_follow = block
         | 
| 132 | 
            -
                end
         | 
| 133 | 
            -
             | 
| 134 | 
            -
                ##
         | 
| 135 | 
            -
                # Starts a loop that checks for any notifications for the authenticated
         | 
| 136 | 
            -
                # user, running the appropriate stored proc when needed
         | 
| 137 | 
            -
                
         | 
| 138 | 
            -
                def run_interact
         | 
| 139 | 
            -
                  @streamer.user do |update|
         | 
| 140 | 
            -
                    if update.kind_of? Mastodon::Notification
         | 
| 141 | 
            -
                      
         | 
| 142 | 
            -
                      case update.type
         | 
| 143 | 
            -
                          
         | 
| 144 | 
            -
                      when 'mention'
         | 
| 145 | 
            -
             | 
| 146 | 
            -
                        # this makes it so .content calls strip instead 
         | 
| 147 | 
            -
                        update.status.class.module_eval { alias_method :content, :strip } if @strip_html
         | 
| 148 | 
            -
                        store_mention_data update.status
         | 
| 149 | 
            -
                        @on_reply.call(self, update.status) unless @on_reply.nil?
         | 
| 150 | 
            -
                        
         | 
| 151 | 
            -
                      when 'reblog'
         | 
| 152 | 
            -
                        @on_boost.call(self, update) unless @on_boost.nil?
         | 
| 153 | 
            -
                        
         | 
| 154 | 
            -
                      when 'favourite'
         | 
| 155 | 
            -
                        @on_fave.call(self, update) unless @on_fave.nil?
         | 
| 156 | 
            -
                        
         | 
| 157 | 
            -
                      when 'follow'
         | 
| 158 | 
            -
                        @on_follow.call(self, update) unless @on_follow.nil?
         | 
| 159 | 
            -
                        
         | 
| 160 | 
            -
                      end
         | 
| 161 | 
            -
                    end
         | 
| 162 | 
            -
                  end
         | 
| 163 | 
            -
                end
         | 
| 164 | 
            -
             | 
| 165 | 
            -
                
         | 
| 166 | 
            -
                alias_method :run, :run_interact
         | 
| 167 | 
            -
              end
         | 
| 168 | 
            -
             | 
| 169 | 
            -
              
         | 
| 170 | 
            -
              module Command
         | 
| 171 | 
            -
                include Elephrame::Reply
         | 
| 172 | 
            -
                
         | 
| 173 | 
            -
                attr_reader :commands, :prefix
         | 
| 174 | 
            -
                attr :cmd_hash, :cmd_regex, :not_found
         | 
| 175 | 
            -
             | 
| 176 | 
            -
                ##
         | 
| 177 | 
            -
                # sets the prefix for commands
         | 
| 178 | 
            -
                #
         | 
| 179 | 
            -
                # @param pf [String] the prefix
         | 
| 180 | 
            -
             | 
| 181 | 
            -
                def set_prefix pf
         | 
| 182 | 
            -
                  @prefix = pf
         | 
| 183 | 
            -
                end
         | 
| 184 | 
            -
             | 
| 185 | 
            -
                ##
         | 
| 186 | 
            -
                # Shortcut method to provide usage docs in response to help command
         | 
| 187 | 
            -
                #
         | 
| 188 | 
            -
                # @param usage [String] 
         | 
| 189 | 
            -
                
         | 
| 190 | 
            -
                def set_help usage
         | 
| 191 | 
            -
                  add_command 'help' do |bot, content, status|
         | 
| 192 | 
            -
                    bot.reply("#{usage}")
         | 
| 193 | 
            -
                  end
         | 
| 194 | 
            -
                end
         | 
| 195 | 
            -
             | 
| 196 | 
            -
                ##
         | 
| 197 | 
            -
                # Adds the command and block into the bot to process later
         | 
| 198 | 
            -
                # also sets up the command regex
         | 
| 199 | 
            -
                #
         | 
| 200 | 
            -
                # @param cmd [String] a command to add
         | 
| 201 | 
            -
                # @param block [Proc] the code to execute when +cmd+ is recieved
         | 
| 202 | 
            -
                
         | 
| 203 | 
            -
                def add_command cmd, &block
         | 
| 204 | 
            -
                  @commands.append cmd unless @commands.include? cmd
         | 
| 205 | 
            -
                  @cmd_hash[cmd.to_sym] = block
         | 
| 206 | 
            -
             | 
| 207 | 
            -
                  # build up our regex (this regex should be fine, i guess :shrug:)
         | 
| 208 | 
            -
                  @cmd_regex = /\A#{@prefix}(?<cmd>#{@commands.join('|')})\b(?<data>.*)/m
         | 
| 209 | 
            -
                end
         | 
| 210 | 
            -
             | 
| 211 | 
            -
                ##
         | 
| 212 | 
            -
                # What to do if we don't match anything
         | 
| 213 | 
            -
                #
         | 
| 214 | 
            -
                # @param block [Proc] a block to run when we don't match a command
         | 
| 215 | 
            -
                
         | 
| 216 | 
            -
                def if_not_found &block
         | 
| 217 | 
            -
                  @not_found = block
         | 
| 218 | 
            -
                end
         | 
| 219 | 
            -
             | 
| 220 | 
            -
                ##
         | 
| 221 | 
            -
                # Starts loop to process any mentions, running command procs set up earlier
         | 
| 222 | 
            -
                
         | 
| 223 | 
            -
                def run_commands
         | 
| 224 | 
            -
                  @streamer.user do |update|
         | 
| 225 | 
            -
                    next unless update.kind_of? Mastodon::Notification and update.type == 'mention'
         | 
| 226 | 
            -
             | 
| 227 | 
            -
                    # set up the status to strip html, if needed
         | 
| 228 | 
            -
                    update.status.class
         | 
| 229 | 
            -
                      .module_eval { alias_method :content, :strip } if @strip_html
         | 
| 230 | 
            -
                    store_mention_data update.status
         | 
| 231 | 
            -
             | 
| 232 | 
            -
                    # strip our username out of the status
         | 
| 233 | 
            -
                    post = update.status.content.gsub(/@#{@username} /, '')
         | 
| 234 | 
            -
             | 
| 235 | 
            -
                    # see if the post matches our regex, running the stored proc if it does
         | 
| 236 | 
            -
                    matches = @cmd_regex.match(post)
         | 
| 237 | 
            -
             | 
| 238 | 
            -
                    unless matches.nil?
         | 
| 239 | 
            -
                      @cmd_hash[matches[:cmd].to_sym]
         | 
| 240 | 
            -
                        .call(self,
         | 
| 241 | 
            -
                              matches[:data].strip,
         | 
| 242 | 
            -
                              update.status)
         | 
| 243 | 
            -
                    else
         | 
| 244 | 
            -
                      @not_found.call(self, update.status)
         | 
| 245 | 
            -
                    end
         | 
| 246 | 
            -
                  end
         | 
| 247 | 
            -
                end
         | 
| 248 | 
            -
             | 
| 249 | 
            -
                alias_method :run, :run_commands
         | 
| 250 | 
            -
              end
         | 
| 251 18 | 
             
            end
         | 
    
        data/lib/elephrame/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: elephrame
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.4. | 
| 4 | 
            +
              version: 0.4.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Zac
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2018-12- | 
| 11 | 
            +
            date: 2018-12-17 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -110,6 +110,9 @@ files: | |
| 110 110 | 
             
            - lib/elephrame/rest/bots.rb
         | 
| 111 111 | 
             
            - lib/elephrame/rest/rest.rb
         | 
| 112 112 | 
             
            - lib/elephrame/streaming/bots.rb
         | 
| 113 | 
            +
            - lib/elephrame/streaming/command.rb
         | 
| 114 | 
            +
            - lib/elephrame/streaming/interaction.rb
         | 
| 115 | 
            +
            - lib/elephrame/streaming/reply.rb
         | 
| 113 116 | 
             
            - lib/elephrame/streaming/streaming.rb
         | 
| 114 117 | 
             
            - lib/elephrame/util/status.rb
         | 
| 115 118 | 
             
            - lib/elephrame/version.rb
         | 
| @@ -120,15 +123,16 @@ metadata: | |
| 120 123 | 
             
              allowed_push_host: https://rubygems.org
         | 
| 121 124 | 
             
              homepage_uri: https://github.com/theZacAttacks/elephrame
         | 
| 122 125 | 
             
              source_code_uri: https://github.com/theZacAttacks/elephrame
         | 
| 126 | 
            +
              changelog_uri: https://github.com/theZacAttacks/elephrame/releases
         | 
| 123 127 | 
             
            post_install_message: 
         | 
| 124 128 | 
             
            rdoc_options: []
         | 
| 125 129 | 
             
            require_paths:
         | 
| 126 130 | 
             
            - lib
         | 
| 127 131 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 128 132 | 
             
              requirements:
         | 
| 129 | 
            -
              - - " | 
| 133 | 
            +
              - - "~>"
         | 
| 130 134 | 
             
                - !ruby/object:Gem::Version
         | 
| 131 | 
            -
                  version: '0'
         | 
| 135 | 
            +
                  version: '2.0'
         | 
| 132 136 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 133 137 | 
             
              requirements:
         | 
| 134 138 | 
             
              - - ">="
         |