diff --git a/app/lib/bangtags.rb b/app/lib/bangtags.rb
index 8fbac8564..a434f36d8 100644
--- a/app/lib/bangtags.rb
+++ b/app/lib/bangtags.rb
@@ -536,7 +536,16 @@ class Bangtags
@component_stack.push(:var)
end
@post_cmds.push(['admin', 'eval'])
- chunk = nil
+ when 'announce'
+ @vars.delete("_admin:announce")
+ @vore_stack.push("_admin:announce")
+ @component_stack.push(:var)
+ c = ['admin', 'announce']
+ c << 'local' if cmd[2].present? && cmd[2].downcase == 'local'
+ @post_cmds.push(c)
+ when 'unannounce'
+ @tf_cmds.push(cmd)
+ @component_stack.push(:tf)
end
end
end
@@ -560,6 +569,31 @@ class Bangtags
next if tf_cmd[1].nil? || chunk.start_with?('`admin:')
output = []
case tf_cmd[1].downcase
+ when 'announce'
+ announcer = ENV['ANNOUNCEMENTS_USER']
+ if announcer.blank?
+ @chunks << 'No announcer set.'
+ next
+ end
+ announcer = Account.find_local(announcer)
+ if announcer.blank?
+ @chunks << 'Announcer account missing.'
+ next
+ end
+ chunk.split.each do |c|
+ c.scan('\d+$').each do |status_id|
+ s = Status.find_by(id: status_id.to_i)
+ if s.nil?
+ output << "Skipped non-existing ID #{status_id}
."
+ next
+ elsif s.account.id != announcer.id
+ output << "Skipped non-announcer ID #{status_id}
."
+ next
+ end
+ output << "Removed announcement ID #{status_id}
."
+ RemoveStatusService.new.call(s)
+ end
+ end
when 'silence'
chunk.split.each do |c|
if c.start_with?('@')
@@ -735,6 +769,31 @@ class Bangtags
@chunks << "
"
@chunks << html_entities.encode(result)
@chunks << "
"
+ when 'announce'
+ announcer = ENV['ANNOUNCEMENTS_USER']
+ if announcer.blank?
+ @chunks << 'No announcer set.'
+ next
+ end
+ announcer = Account.find_local(announcer)
+ if announcer.blank?
+ @chunks << 'Announcer account missing.'
+ next
+ end
+
+ name = @account.user.vars['_they:are']
+ if name.present?
+ footer = "#{@account.user.vars["_they:are:#{name}"]} from @#{@account.username}"
+ else
+ footer = "@#{@account.username}"
+ end
+
+ PostStatusService.new.call(
+ announcer,
+ text: @vars['_admin:announce'],
+ footer: footer,
+ local_only: post_cmd[2] == 'local'
+ )
end
end
end