mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-22 20:06:22 +00:00
73 lines
2 KiB
Ruby
73 lines
2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
# Relación entre Fediblocks y Sites
|
||
|
class FediblockState < ApplicationRecord
|
||
|
include AASM
|
||
|
|
||
|
belongs_to :site
|
||
|
belongs_to :fediblock, class_name: 'ActivityPub::Fediblock'
|
||
|
|
||
|
# El efecto secundario de esta máquina de estados es modificar el
|
||
|
# estado de moderación de cada instancia en el sitio. Nos salteamos
|
||
|
# los hooks de los eventos individuales.
|
||
|
aasm do
|
||
|
# Aunque queramos las listas habilitadas por defecto, tenemos que
|
||
|
# habilitarlas luego de crearlas para poder generar la lista de
|
||
|
# bloqueo en la Social Inbox.
|
||
|
state :disabled, initial: true
|
||
|
state :enabled
|
||
|
|
||
|
event :enable do
|
||
|
transitions from: :disabled, to: :enabled
|
||
|
|
||
|
before do
|
||
|
enable_remotely!
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# Al deshabilitar, las listas pasan a modo pausa.
|
||
|
#
|
||
|
# @todo No cambiar el estado si se habían habilitado manualmente,
|
||
|
# pero esto implica que tenemos que encontrar las que sí y quitarlas
|
||
|
# de list_names
|
||
|
event :disable do
|
||
|
transitions from: :enabled, to: :disabled
|
||
|
|
||
|
before do
|
||
|
disable_remotely!
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
# Obtiene todos los IDs de instancias para poder obtener el estado de
|
||
|
# moderación en el sitio.
|
||
|
#
|
||
|
# @return [Array<String>]
|
||
|
def instance_ids
|
||
|
ActivityPub::Instance.where(hostname: fediblock.instances).pluck(:id)
|
||
|
end
|
||
|
|
||
|
# @return [Array<String>]
|
||
|
def list_names
|
||
|
@list_names ||= fediblock.instances.map do |instance|
|
||
|
"@*@#{instance}"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# Al deshabilitar, las instancias pasan a ser analizadas caso por caso
|
||
|
def disable_remotely!
|
||
|
raise AASM::InvalidTransition unless
|
||
|
site.social_inbox.blocklist.delete(list: list_names).ok? &&
|
||
|
site.social_inbox.allowlist.delete(list: list_names).ok?
|
||
|
end
|
||
|
|
||
|
# Al habilitar, se bloquean todas las instancias de la lista
|
||
|
def enable_remotely!
|
||
|
raise AASM::InvalidTransition unless
|
||
|
site.social_inbox.blocklist.post(list: list_names).ok? &&
|
||
|
site.social_inbox.allowlist.delete(list: list_names).ok?
|
||
|
end
|
||
|
end
|