discourse/lib/tasks/populate.thor
2023-08-10 13:59:13 +02:00

262 lines
6.4 KiB
Ruby

# frozen_string_literal: true
# Generates posts and topics
class Populate < Thor
desc "posts", "Generate posts"
long_desc <<-MD
Create topics with any number of posts, or add posts to an existing topic.
Examples:
Create a new topic with 100 posts from batman and spiderman:
> $ thor populate:posts -n 100 -u batman spiderman -t "So many posts"
Add 10 posts to topic with id 123:
> $ thor populate:posts -n 10 -u batman spiderman -i 123
Generate 10 topics with 5 posts:
> $ thor populate:posts -p 10 -n 5
MD
method_option :num_posts,
aliases: "-n",
type: :numeric,
required: true,
desc: "Number of posts to make"
method_option :users,
aliases: "-u",
type: :array,
desc: "Usernames of users who will make the posts"
method_option :title, aliases: "-t", desc: "The title of the topic, if making a new topic"
method_option :topic_id,
aliases: "-i",
type: :numeric,
desc: "The id of the topic where the posts will be added"
method_option :num_topics,
aliases: "-p",
type: :numeric,
default: 1,
desc: "Number of topics to create"
def posts
require "./config/environment"
users = []
if options[:users]
options[:users].each do |u|
provided_user = User.find_by_username(u.downcase)
puts "No user found: #{provided_user}" if provided_user.nil?
users << provided_user if provided_user
end
else
10.times do
user = create_user(generate_email)
users << user
end
end
RateLimiter.disable
options[:num_topics].times do
topic = Topic.find_by(id: options[:topic_id])
start_post = 1
topic = create_topic(users) unless topic
puts "Adding posts to '#{topic.title}'"
puts "Making #{options[:num_posts]} posts"
(start_post..options[:num_posts]).each { create_post(users, topic) }
puts ""
puts "Done. Topic id = #{topic.id}"
end
ensure
RateLimiter.enable
end
private
def create_user(user_email)
user = User.find_by_email(user_email)
unless user
puts "Creating new account: #{user_email}"
user =
User.create!(
email: user_email,
password: SecureRandom.hex,
username: UserNameSuggester.suggest(user_email),
)
end
user.active = true
user.save!
user
end
def create_topic(users)
topic_title = options[:title] || generate_sentence(5)
puts "Making a new topic: '#{topic_title}'"
post_creator = PostCreator.new(users.sample, title: topic_title, raw: generate_sentence(7))
first_post = post_creator.create
unless first_post
puts post_creator.errors.full_messages, ""
raise StandardError.new(post_creator.errors.full_messages)
end
topic = first_post.topic
start_post = 2
topic
end
def create_post(users, topic)
print "."
raw =
(
if rand(4) == 0
(rand(2) == 0 ? image_posts.sample : wikipedia_posts.sample)
else
generate_sentence(7)
end
)
post_creator = PostCreator.new(users.sample, topic_id: topic.id, raw: raw)
post = post_creator.create
puts post_creator.errors.full_messages, "" unless post
post
end
def hipster_words
@hipster_words ||= [
"etsy",
"twee",
"hoodie",
"Banksy",
"retro",
"synth",
"single-origin",
"coffee",
"art",
"party",
"cliche",
"artisan",
"Williamsburg",
"squid",
"helvetica",
"keytar",
"American Apparel",
"craft beer",
"food truck",
"you probably haven't heard of them",
"cardigan",
"aesthetic",
"raw denim",
"sartorial",
"gentrify",
"lomo",
"Vice",
"Pitchfork",
"Austin",
"sustainable",
"salvia",
"organic",
"thundercats",
"PBR",
"iPhone",
"lo-fi",
"skateboard",
"jean shorts",
"next level",
"beard",
"tattooed",
"trust fund",
"Four Loko",
"master cleanse",
"ethical",
"high life",
"wolf moon",
"fanny pack",
"Terry Richardson",
"8-bit",
"Carles",
"Shoreditch",
"seitan",
"freegan",
"keffiyeh",
"biodiesel",
"quinoa",
"farm-to-table",
"fixie",
"viral",
"chambray",
"scenester",
"leggings",
"readymade",
"Brooklyn",
"Wayfarers",
"Marfa",
"put a bird on it",
"dreamcatcher",
"photo booth",
"tofu",
"mlkshk",
"vegan",
"vinyl",
"DIY",
"banh mi",
"bicycle rights",
"before they sold out",
"gluten-free",
"yr butcher blog",
"whatever",
"+1",
"Cosby Sweater",
"VHS",
"messenger bag",
"cred",
"locavore",
"mustache",
"tumblr",
"Portland",
"mixtape",
"fap",
"letterpress",
"McSweeney's",
"stumptown",
"brunch",
"Wes Anderson",
"irony",
"echo park",
]
end
def generate_sentence(num_words)
sentence = hipster_words.sample(num_words).join(" ").capitalize + "."
sentence.force_encoding("UTF-8")
end
def generate_email
email = hipster_words.sample.delete(" ") + "@" + hipster_words.sample.delete(" ") + ".com"
email.delete("'").force_encoding("UTF-8")
end
def image_posts
@image_posts ||= [
"http://i.imgur.com/CnRF48R.jpg\n\n",
"http://i.imgur.com/2iaeK.png\n\n",
"http://i.imgur.com/WSD5t61.jpg\n\n",
"http://i.imgur.com/GUldmUd.jpg\n\n",
"http://i.imgur.com/nJnb6Bj.jpg\n\n",
"http://i.imgur.com/eljDYjm.jpg\n\n",
"http://i.imgur.com/5yZMWyY.png\n\n",
"http://i.imgur.com/2iCPGm2.jpg\n\n",
]
end
def wikipedia_posts
@wikipedia_posts ||= [
"http://en.wikipedia.org/wiki/Dwarf_fortress\n\n",
"http://en.wikipedia.org/wiki/Action_plan\n\n",
"http://en.wikipedia.org/wiki/Chang%27e_3\n\n",
"http://en.wikipedia.org/wiki/Carl_sagan\n\n",
"http://en.wikipedia.org/wiki/Chasmosaurus\n\n",
"http://en.wikipedia.org/wiki/Indian_Space_Research_Organisation\n\n",
"http://en.wikipedia.org/wiki/Rockstar_Consortium\n\n",
"http://en.wikipedia.org/wiki/Manitoulin_island\n\n",
]
end
end