module DK::Posts
Post
operations common to queue/draft
Helper Methods
Public Instance Methods
Collect all Posts
@param last_id [Int] ID of post to begin reading from (for reading Drafts) @param offset [Int] Post
index to start reading from (for reading Queue) @param blog_url [String] URL of blog to read from @param source [Symbol] Get posts from :draft or :queue @return [[Post]] Array of Post
Hash data
# File lib/draftking/posts.rb, line 192 def all_posts(last_id: 0, offset: 0) chunk = some_posts(before_id: last_id, offset: offset) return chunk if chunk.empty? chunk + all_posts(last_id: chunk.last['id'], offset: offset + chunk.size) end
Publish posts at an interval, first in first out @param options [String] String to add as comment @param options [Symbol] Target posts from :draft or :queue @param options [Bool] Simulation? @param options [String] Tags to add @param options [Bool] Preserve old tags? @param options [Bool] Preserve old comments? @return [nil]
# File lib/draftking/posts.rb, line 219 def auto_poster(options = {}) process_options(options) act_on_blog(name: @blog_name) pprint "Retrieving posts...(can take a while for large queues)\r" posts = all_posts.reverse # FIFO total = posts.size pputs "Found #{total} posts in #{@source.capitalize}#{'s' if @source[0] == 'd'}." pputs 'Press CTRL + C to exit.' interval = 432 # 200 posts / 24 hours = 432sec posts.each_with_index do |current, idx| pprint "Publishing post #{idx}/#{total}.\r" post = Post.new(current, keep_tree: @keep_tags) post.change_state(DK::PUBLISH) post.replace_comment_with(@comment) post.generate_tags(keep_tags: @keep_tags, add_tags: @tags, exclude: @comment, credit: true) if @auto_tag unless post.save(client: @client, simulate: @simulate) > 0 pputs "Error at Index: #{idx}. Unable to save post!" pputs "reblog_key: #{post.reblog_key}, id: #{post.post_id}" pputs 'Quitting auto-poster.' exit 1 end pprint "Published #{idx}/#{total} posts. Next post at #{Time.now + interval}\r" sleep interval unless idx == total end # End of auto-posting pputs 'Auto-Poster has completed!' end
Determine number of modified posts
# File lib/draftking/posts.rb, line 67 def calculate_result(result_q) mod_count = 0 mod_posts = [] return [mod_count, mod_posts] if result_q.empty? while post = result_q.pop mod_count += post.saved mod_posts << post if post.saved > 0 break if result_q.empty? end [mod_count, mod_posts] end
Dashboard integration
# File lib/draftking/posts.rb, line 159 def call_source(options) begin return @client.send(@source, options).first[1] if dashboard? || likes? @client.send(check_for_publish(@source), @blog_url, options) rescue retry end end
# File lib/draftking/posts.rb, line 168 def check_for_publish(source) return source unless source.eql?(PUBLISH) :posts end
Add a comment to Posts
@param options [Bool] Give dk credit? @param options [String] String to add as comment @param options [Int] Max number of modified posts @param options [String] Message to display during processing @param options [Symbol] Target posts from :draft or :queue @param options [Bool] Simulation? @param options [String] Suppress progress indicator @return [int] Number of modified posts
# File lib/draftking/posts.rb, line 88 def comment_posts(options = {}) src = source_string(options[:source]) options[:message] = "Adding #{src} comment \'#{comment}\': " post_operation(options) do |post, _| post.replace_comment_with(@comment) post.generate_tags(keep_tags: @keep_tags, add_tags: @tags, exclude: @comment, credit: @credit) if @auto_tag end end
# File lib/draftking/posts.rb, line 203 def dashboard? @source == :dashboard end
Work queue processor
# File lib/draftking/posts.rb, line 29 def generate_worker(*data, block) work, results, total = data begin while post = work.pop(true) po = Post.new(post, keep_tree: @keep_tree) block.call(po, results.size) # Do work on Post po.save(client: @client, simulate: @simulate) results.push(po) show_progress(current: results.size, total: total, message: message) unless @mute end rescue ThreadError # Queue empty end end
Determine draft data to use. @param options [[Hash]] Array of post hash data @param options [Int] Limit # of posts selected @param options [String] URL of blog to read from @param options [Symbol] Get posts from :draft or :queue @param options [Int] [:draft] ID of post to begin reading from @param options [Int] [:queue] Post
index to start reading from @return [[Post]] Array of Post
Hash data
# File lib/draftking/posts.rb, line 128 def get_posts pprint "Getting posts...\r" return some_test_data if @test_data return some_posts(offset: @offset) if dashboard? return all_posts.uniq if @greedy || @limit.nil? return some_posts(offset: @offset, before_id: @before_id) if @limit <= 50 limited_posts end
index < limit
# File lib/draftking/posts/posts_helpers.rb, line 60 def index_within_limit?(index, limit) return true if limit.nil? || limit.zero? index < limit end
# File lib/draftking/posts.rb, line 207 def likes? @source == :likes end
Get @limit # of Posts
# File lib/draftking/posts.rb, line 174 def limited_posts result = [] until result.size >= @limit chunk = some_posts(offset: @offset, before_id: @before_id) break if chunk.empty? result += chunk @offset = chunk.size @before_id = chunk.last['id'] end result.take(@limit) end
Common code for Post
operations @param options [Int] Maximum number of posts to process @param options [String] Message to display during processing @param options [Bool] Randomize order of posts @param options [String] Name of blog to target @param options [String] Suppress progress indicator @param options [[Hash]] Array of post hash data @param options [Bool] Simulation? @return [int] Number of modified posts
# File lib/draftking/posts.rb, line 17 def post_operation(options, &block) work, total, results, reporter = setup_operation(options) workers = (0...DK::MAX_THREADS).map { Thread.new { generate_worker(work, results, total, block) } } workers.map(&:join) mod_count, mod_posts = calculate_result(results) show_progress(message: message, done: true, modified: mod_count) unless @mute reporter.new(objects: mod_posts, title: REPORT_TITLE, fields: REPORT_FIELDS, simulate: @simulate).show unless @mute act_on_blog(name: @blog_name) # Refresh account info [mod_count, mod_posts] end
Create queue of Posts
for worker threads
# File lib/draftking/posts.rb, line 60 def posts_to_queue(posts) work_q = Queue.new posts.each { |p| work_q.push(p) } work_q end
# File lib/draftking/posts/posts_helpers.rb, line 8 def pprint(str) puts str unless @mute || !@show_pi end
# File lib/draftking/posts/posts_helpers.rb, line 4 def pputs(str) puts str unless @mute || !@show_pi end
Values for displaying completed process
# File lib/draftking/posts/posts_helpers.rb, line 27 def setup_done(modified) indicator = '√ ' newline = "\n" progress = "(#{modified} modified)" [indicator, newline, progress] end
Common initialization for post operations
# File lib/draftking/posts.rb, line 44 def setup_operation(options) pprint "Setup\r" process_options(options) act_on_blog(name: @blog_name) posts = @shuffle ? shufflex(get_posts.reverse, 3) : get_posts.reverse posts = posts.take(@limit) if @limit work = posts_to_queue(posts) reporter = options[:reporter] || DK::Reporter [work, work.size, Queue.new, reporter] end
Values for displaying in-progress process
# File lib/draftking/posts/posts_helpers.rb, line 35 def setup_undone(current, total) tildes = current.to_i % 4 indicator = "~#{'~' * tildes}#{' ' * (3 - tildes)}> " newline = nil percentage = total > 0 ? ((current.to_f / total.to_f) * 100).round : 0 progress = "#{current} / #{total} [#{percentage}\%] " [indicator, newline, progress] end
Display progress percentage @param current [Int] Progress Counter @param total [Int] # Items to be processed @param message [String] Display message for process @param done [Bool] Processing Complete? @param modified [Int] # of items modified
# File lib/draftking/posts/posts_helpers.rb, line 18 def show_progress(current: 0, total: 0, message: '', done: false, modified: 0) return unless @show_pi indicator, newline, progress = setup_done(modified) if done indicator, newline, progress = setup_undone(current, total) unless done pprint "#{indicator}#{message}#{progress}#{' ' * 30}\r#{newline}" $stdout.flush unless done end
# File lib/draftking/posts.rb, line 55 def shufflex(arr, num) (0..num).to_a.inject(arr) { |m, _| m = m.shuffle; m } end
Get up to 50 Posts
@param before_id [Int] [:draft] ID of post to begin reading from @param offset [Int] [:queue] Post
index to start reading from @return [[Post]] Array of Post
Hash data
# File lib/draftking/posts.rb, line 141 def some_posts(before_id: 0, offset: 0, max_id: nil, since_id: nil) options = { limit: [(@limit || 50), 50].min } options[:max_id] = max_id if max_id options[:since_id] = since_id if since_id options[@source == :draft ? :before_id : :offset] = (@source == :draft ? before_id : offset) unless dashboard? options[:type] = @type if @type begin retries ||= 0 result = call_source(options)['posts'] result.is_a?(Integer) ? (raise TypeError) : result rescue TypeError (retries += 1) > MAX_RETRY ? [] : retry end end
Handle limits for test data
# File lib/draftking/posts.rb, line 199 def some_test_data @limit ? @test_data.take(@limit) : @test_data end
Convert source symbol to string @param symbol [Symbol] Source Symbol
# File lib/draftking/posts/posts_helpers.rb, line 54 def source_string(symbol) return 'draft' unless symbol symbol.to_s end
@param options [Bool] Give dk credit? @param options [Symbol] Target posts from :draft or :queue @param options [String] Suppress progress indicator @param options [String] Name of blog to target @param options [Bool] Preserve existing post tags @param options [Bool] Preserve existing post comments @param options [Bool] Simulation? @param options [String] Exclude :comment from tags @return [int] Number of modified posts
# File lib/draftking/posts.rb, line 109 def tag_posts(options) src = source_string(options[:source]) options[:message] = "Tagging #{src} with #{options[:add_tags]}: " post_operation(options) do |post, _| post.generate_tags(keep_tags: @keep_tags, add_tags: @tags, exclude: @comment, credit: @credit) if @auto_tag end end
Construct Tumblr
URL string @param blog_name [String] Blog Name
# File lib/draftking/posts/posts_helpers.rb, line 46 def tumblr_url(blog_name) return '' unless blog_name blog_name += '.tumblr.com' unless blog_name.include?('.') blog_name end