discourse/plugins/chat/lib/tasks/chat_message.rake

144 lines
4.4 KiB
Ruby

# frozen_string_literal: true
task "chat_messages:rebake_uncooked_chat_messages" => :environment do
# rebaking uncooked chat_messages can very quickly saturate sidekiq
# this provides an insurance policy so you can safely run and stop
# this rake task without worrying about your sidekiq imploding
Jobs.run_immediately!
ENV["RAILS_DB"] ? rebake_uncooked_chat_messages : rebake_uncooked_chat_messages_all_sites
end
def rebake_uncooked_chat_messages_all_sites
RailsMultisite::ConnectionManagement.each_connection { |db| rebake_uncooked_chat_messages }
end
def rebake_uncooked_chat_messages
puts "Rebaking uncooked chat messages on #{RailsMultisite::ConnectionManagement.current_db}"
uncooked = ChatMessage.uncooked
rebaked = 0
total = uncooked.count
ids = uncooked.pluck(:id)
# work randomly so you can run this job from lots of consoles if needed
ids.shuffle!
ids.each do |id|
# may have been cooked in interim
chat_message = uncooked.where(id: id).first
rebake_chat_message(chat_message) if chat_message
print_status(rebaked += 1, total)
end
puts "", "#{rebaked} chat messages done!", ""
end
def rebake_chat_message(chat_message, opts = {})
opts[:priority] = :ultra_low if !opts[:priority]
chat_message.rebake!(**opts)
rescue => e
puts "",
"Failed to rebake chat message (chat_message_id: #{chat_message.id})",
e,
e.backtrace.join("\n")
end
task "chat:make_channel_to_test_archiving", [:user_for_membership] => :environment do |t, args|
user_for_membership = args[:user_for_membership]
# do not want this running in production!
return if !Rails.env.development?
require "fabrication"
Dir[Rails.root.join("spec/fabricators/*.rb")].each { |f| require f }
messages = [
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"Cras sit **amet** metus eget nisl accumsan ullamcorper.",
"Vestibulum commodo justo _quis_ fringilla fringilla.",
"Etiam malesuada erat eget aliquam interdum.",
"Praesent mattis lacus nec ~~orci~~ [spoiler]semper[/spoiler], et fermentum augue tincidunt.",
"Duis vel tortor suscipit justo fringilla faucibus id tempus purus.",
"Phasellus *tempus erat* sit amet pharetra facilisis.",
"Fusce egestas urna ut nisi ornare, ut malesuada est fermentum.",
"Aenean ornare arcu vitae pulvinar dictum.",
"Nam at turpis eu magna sollicitudin fringilla sed sed diam.",
"Proin non [enim](https://discourse.org/team) nec mauris efficitur convallis.",
"Nullam cursus lacus non libero vulputate ornare.",
"In eleifend ante ut ullamcorper ultrices.",
"In placerat diam sit amet nibh feugiat, in posuere metus feugiat.",
"Nullam porttitor leo a leo `cursus`, id hendrerit dui ultrices.",
"Pellentesque ut @#{user_for_membership} ut ex pulvinar pharetra sit amet ac leo.",
"Vestibulum sit amet enim et lectus tincidunt rhoncus hendrerit in enim.",
<<~MSG,
some bigger message
```ruby
beep = \"wow\"
puts beep
```
MSG
]
topic = nil
chat_channel = nil
Topic.transaction do
topic =
Fabricate(
:topic,
user: make_test_user,
title: "Testing topic for chat archiving #{SecureRandom.hex(4)}",
)
Fabricate(
:post,
topic: topic,
user: topic.user,
raw: "This is some cool first post for archive stuff",
)
chat_channel =
ChatChannel.create(
chatable: topic,
chatable_type: "Topic",
name: "testing channel for archiving #{SecureRandom.hex(4)}",
)
end
puts "topic: #{topic.id}, #{topic.title}"
puts "channel: #{chat_channel.id}, #{chat_channel.name}"
users = [make_test_user, make_test_user, make_test_user]
ChatChannel.transaction do
start_time = Time.now
puts "creating 1039 messages for the channel"
1039.times do
cm = ChatMessage.new(message: messages.sample, user: users.sample, chat_channel: chat_channel)
cm.cook
cm.save!
end
puts "message creation done"
puts "took #{Time.now - start_time} seconds"
UserChatChannelMembership.create(
chat_channel: chat_channel,
last_read_message_id: 0,
user: User.find_by(username: user_for_membership),
following: true,
)
end
puts "channel is located at #{chat_channel.url}"
end
def make_test_user
return if !Rails.env.development?
unique_prefix = "archiveuser#{SecureRandom.hex(4)}"
Fabricate(:user, username: unique_prefix, email: "#{unique_prefix}@testemail.com")
end