module DK::Posts

Post operations common to queue/draft

Helper Methods

Public Instance Methods

all_posts(last_id: 0, offset: 0) click to toggle source

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
auto_poster(options = {}) click to toggle source

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
calculate_result(result_q) click to toggle source

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
call_source(options) click to toggle source

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
check_for_publish(source) click to toggle source
# File lib/draftking/posts.rb, line 168
def check_for_publish(source)
  return source unless source.eql?(PUBLISH)
  :posts
end
comment_posts(options = {}) click to toggle source

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
dashboard?() click to toggle source
# File lib/draftking/posts.rb, line 203
def dashboard?
  @source == :dashboard
end
generate_worker(*data, block) click to toggle source

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
get_posts() click to toggle source

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_within_limit?(index, limit) click to toggle source

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
likes?() click to toggle source
# File lib/draftking/posts.rb, line 207
def likes?
  @source == :likes
end
limited_posts() click to toggle source

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
post_operation(options, &block) click to toggle source

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
posts_to_queue(posts) click to toggle source

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
pprint(str) click to toggle source
# File lib/draftking/posts/posts_helpers.rb, line 8
def pprint(str)
  puts str unless @mute || !@show_pi
end
pputs(str) click to toggle source
# File lib/draftking/posts/posts_helpers.rb, line 4
def pputs(str)
  puts str unless @mute || !@show_pi
end
setup_done(modified) click to toggle source

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
setup_operation(options) click to toggle source

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
setup_undone(current, total) click to toggle source

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
show_progress(current: 0, total: 0, message: '', done: false, modified: 0) click to toggle source

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
shufflex(arr, num) click to toggle source
# File lib/draftking/posts.rb, line 55
def shufflex(arr, num)
  (0..num).to_a.inject(arr) { |m, _| m = m.shuffle; m }
end
some_posts(before_id: 0, offset: 0, max_id: nil, since_id: nil) click to toggle source

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
some_test_data() click to toggle source

Handle limits for test data

# File lib/draftking/posts.rb, line 199
def some_test_data
  @limit ? @test_data.take(@limit) : @test_data
end
source_string(symbol) click to toggle source

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
tag_posts(options) click to toggle source

@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
tumblr_url(blog_name) click to toggle source

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