about summary refs log tree commit diff
path: root/app/lib
diff options
context:
space:
mode:
authormultiple creatures <dev@multiple-creature.party>2019-07-16 21:30:00 -0500
committermultiple creatures <dev@multiple-creature.party>2019-07-17 00:28:48 -0500
commit2089a78f820401e7d3743322c3fffadea96421fc (patch)
treedc6f26cb7681a8f3ae1eb891078f5650c71df589 /app/lib
parent17a701b443669b63248aca449f665a274d3e41b1 (diff)
`admin:silence` and `admin:suspend` bangtags
Diffstat (limited to 'app/lib')
-rw-r--r--app/lib/bangtags.rb74
1 files changed, 74 insertions, 0 deletions
diff --git a/app/lib/bangtags.rb b/app/lib/bangtags.rb
index 294e1dd69..d6b219c2a 100644
--- a/app/lib/bangtags.rb
+++ b/app/lib/bangtags.rb
@@ -490,6 +490,16 @@ class Bangtags
           chunk = rand(6..33).times.collect do
             keyboard[(keyboard.size * (rand ** 3)).floor].split('').sample
           end
+        when 'admin'
+          chunk = nil
+          next unless @account.user.admin?
+          next if cmd[1].nil?
+          case cmd[1].downcase
+          when 'silence', 'suspend'
+            chunk = "`admin:#{cmd[1].downcase}`:\n"
+            @tf_cmds.push(cmd)
+            @component_stack.push(:tf)
+          end
         end
       end
 
@@ -505,6 +515,70 @@ class Bangtags
             tf_cmd[1..-1].in_groups_of(2) do |args|
               chunk.gsub!(*args) if args.all?
             end
+          when 'admin'
+            next unless @account.user.admin?
+            next if tf_cmd[1].nil? || chunk.start_with?('`admin:')
+            output = []
+            case tf_cmd[1].downcase
+            when 'silence'
+              chunk.split.each do |c|
+                if c.start_with?('@')
+                  parts = c.split('@')[1..2]
+                  a = Account.find_by(username: parts[0], domain: parts[1])
+                  next if a.nil?
+                  output << "    Silenced `@#{parts.join('@')}`"
+                  Admin::ActionLog.create(account: @account, action: :silence, target: a)
+                  a.silence!
+                  a.save
+                elsif c.match?(/^[\w\-]+\.[\w\-]+(?:\.[\w\-]+)*$/)
+                  c.downcase!
+                  next if c.end_with?('monsterpit.net', 'tailma.ws')
+                  begin
+                    code = Request.new(:head, "https://#{c}").perform(&:code)
+                  rescue
+                    next
+                  end
+                  next if [404, 410].include?(code)
+                  domain_block = DomainBlock.find_or_create_by(domain: c)
+                  domain_block.severity = "silence"
+                  domain_block.save
+                  output << "    Silenced `#{c}`"
+                  Admin::ActionLog.create(account: @account, action: :create, target: domain_block)
+                  BlockDomainService.new.call(domain_block)
+                end
+              end
+              output = ['    No action.'] if output.blank?
+              chunk = output.join("\n") + "\n"
+            when 'suspend'
+              chunk.split.each do |c|
+                if c.start_with?('@')
+                  parts = c.split('@')[1..2]
+                  a = Account.find_by(username: parts[0], domain: parts[1])
+                  next if a.nil?
+                  output << "    Suspended `@#{parts.join('@')}`"
+                  Admin::ActionLog.create(account: @account, action: :suspend, target: a)
+                  SuspendAccountService.new.call(a, include_user: true)
+                elsif c.match?(/\A[\w\-]+\.[\w\-]+(?:\.[\w\-]+)*\Z/)
+                  c.downcase!
+                  next if c.end_with?('monsterpit.net', 'tailma.ws')
+                  begin
+                    code = Request.new(:head, "https://#{c}").perform(&:code)
+                  rescue
+                    next
+                  end
+                  next if [404, 410].include?(code)
+                  domain_block = DomainBlock.find_or_create_by(domain: c)
+                  domain_block.severity = "suspend"
+                  domain_block.reject_media = true
+                  domain_block.save
+                  output << "    Suspended `#{c}`"
+                  Admin::ActionLog.create(account: @account, action: :create, target: domain_block)
+                  BlockDomainService.new.call(domain_block)
+                end
+              end
+              output = ['    No action.'] if output.blank?
+              chunk = output.join("\n") + "\n"
+            end
           end
         end
       end