diff --git a/roles/matrix-bridge-appservice-discord/defaults/main.yml b/roles/matrix-bridge-appservice-discord/defaults/main.yml new file mode 100644 index 00000000..d9406774 --- /dev/null +++ b/roles/matrix-bridge-appservice-discord/defaults/main.yml @@ -0,0 +1,131 @@ +# matrix-appservice-discord is a Matrix <-> Discord bridge +# See: https://github.com/Half-Shot/matrix-appservice-discord + +matrix_appservice_discord_enabled: true + +matrix_appservice_discord_docker_image: "halfshot/matrix-appservice-discord:latest" + +matrix_appservice_discord_base_path: "{{ matrix_base_data_path }}/appservice-discord" + +# Get your own keys at https://discordapp.com/developers/applications/me/create +matrix_appservice_discord_client_id: '' +matrix_appservice_discord_bot_token: '' + +# Controls whether the Appservice Discord container exposes the Client/Server API port (tcp/9005). +matrix_appservice_discord_container_expose_client_server_api_port: false + +# A list of extra arguments to pass to the container +matrix_appservice_discord_container_extra_arguments: [] + +# List of systemd services that matrix-appservice-discord.service depends on. +matrix_appservice_discord_systemd_required_services_list: ['docker.service'] + +# List of systemd services that matrix-appservice-discord.service wants +matrix_appservice_discord_systemd_wanted_services_list: [] + +matrix_appservice_discord_configuration_yaml: | + bridge: + domain: "{{ matrix_domain }}" + homeserverUrl: "{{ matrix_homeserver_url }}" + auth: + clientID: "{{matrix_appservice_discord_client_id}}" + botToken: "{{matrix_appservice_discord_bot_token}}" + database: + filename: "/data/discord.db" + userStorePath: "/data/user-store.db" + roomStorePath: "/data/room-store.db" + +matrix_appservice_discord_configuration_extension_yaml: | + # This is a sample of the config file showing all avaliable options. + # Where possible we have documented what they do, and all values are the + # default values. + # + #bridge: + # # Domain part of the bridge, e.g. matrix.org + # domain: "localhost" + # # This should be your publically facing URL because Discord may use it to + # # fetch media from the media store. + # homeserverUrl: "http://localhost:8008" + # # Interval at which to process users in the 'presence queue'. If you have + # # 5 users, one user will be processed every 500 milliseconds according to the + # # value below. This has a minimum value of 250. + # # WARNING: This has a high chance of spamming the homeserver with presence + # # updates since it will send one each time somebody changes state or is online. + # presenceInterval: 500 + # # Disable setting presence for 'ghost users' which means Discord users on Matrix + # # will not be shown as away or online. + # disablePresence: false + # # Disable sending typing notifications when somebody on Discord types. + # disableTypingNotifications: false + # # Disable deleting messages on Discord if a message is redacted on Matrix. + # disableDeletionForwarding: false + # # Enable users to bridge rooms using !discord commands. See + # # https://t2bot.io/discord for instructions. + # enableSelfServiceBridging: false + # # Disable sending of read receipts for Matrix events which have been + # # successfully bridged to Discord. + # disableReadReceipts: false + # Authentication configuration for the discord bot. + #auth: + # clientID: "12345" + # botToken: "foobar" + #logging: + # # What level should the logger output to the console at. + # console: "warn" #silly, verbose, info, http, warn, error, silent + # lineDateFormat: "MMM-D HH:mm:ss.SSS" # This is in moment.js format + # files: + # - file: "debug.log" + # disable: + # - "PresenceHandler" # Will not capture presence logging + # - file: "warn.log" # Will capture warnings + # level: "warn" + # - file: "botlogs.log" # Will capture logs from DiscordBot + # level: "info" + # enable: + # - "DiscordBot" + #database: + # userStorePath: "user-store.db" + # roomStorePath: "room-store.db" + # # You may either use SQLite or Postgresql for the bridge database, which contains + # # important mappings for events and user puppeting configurations. + # # Use the filename option for SQLite, or connString for Postgresql. + # # If you are migrating, see https://github.com/Half-Shot/matrix-appservice-discord/blob/master/docs/howto.md#migrate-to-postgres-from-sqlite + # # WARNING: You will almost certainly be fine with sqlite unless your bridge + # # is in heavy demand and you suffer from IO slowness. + # filename: "discord.db" + # # connString: "postgresql://user:password@localhost/database_name" + #room: + # # Set the default visibility of alias rooms, defaults to "public". + # # One of: "public", "private" + # defaultVisibility: "public" + #channel: + # # Pattern of the name given to bridged rooms. + # # Can use :guild for the guild name and :name for the channel name. + # namePattern: "[Discord] :guild :name" + # # Changes made to rooms when a channel is deleted. + # deleteOptions: + # # Prefix the room name with a string. + # #namePrefix: "[Deleted]" + # # Prefix the room topic with a string. + # #topicPrefix: "This room has been deleted" + # # Disable people from talking in the room by raising the event PL to 50 + # disableMessaging: false + # # Remove the discord alias from the room. + # unsetRoomAlias: true + # # Remove the room from the directory. + # unlistFromDirectory: true + # # Set the room to be unavaliable for joining without an invite. + # setInviteOnly: true + # # Make all the discord users leave the room. + # ghostsLeave: true + #limits: + # # Delay in milliseconds between discord users joining a room. + # roomGhostJoinDelay: 6000 + # # Delay in milliseconds before sending messages to discord to avoid echos. + # # (Copies of a sent message may arrive from discord before we've + # # fininished handling it, causing us to echo it back to the room) + # discordSendDelay: 750 + +matrix_appservice_discord_configuration_extension: "{{ matrix_appservice_discord_configuration_extension_yaml|from_yaml if matrix_appservice_discord_configuration_extension_yaml|from_yaml else {} }}" + +matrix_appservice_discord_configuration: "{{ matrix_appservice_discord_configuration_yaml|from_yaml|combine(matrix_appservice_discord_configuration_extension, recursive=True) }}" diff --git a/roles/matrix-synapse/tasks/ext/appservice-discord/init.yml b/roles/matrix-bridge-appservice-discord/tasks/init.yml similarity index 100% rename from roles/matrix-synapse/tasks/ext/appservice-discord/init.yml rename to roles/matrix-bridge-appservice-discord/tasks/init.yml diff --git a/roles/matrix-bridge-appservice-discord/tasks/main.yml b/roles/matrix-bridge-appservice-discord/tasks/main.yml new file mode 100644 index 00000000..06e64110 --- /dev/null +++ b/roles/matrix-bridge-appservice-discord/tasks/main.yml @@ -0,0 +1,21 @@ +- import_tasks: "{{ role_path }}/tasks/init.yml" + tags: + - always + +- import_tasks: "{{ role_path }}/tasks/validate_config.yml" + when: "run_setup and matrix_appservice_discord_enabled" + tags: + - setup-all + - setup-appservice-discord + +- import_tasks: "{{ role_path }}/tasks/setup-install.yml" + when: "run_setup and matrix_appservice_discord_enabled" + tags: + - setup-all + - setup-appservice-discord + +- import_tasks: "{{ role_path }}/tasks/setup-uninstall.yml" + when: "run_setup and not matrix_appservice_discord_enabled" + tags: + - setup-all + - setup-appservice-discord diff --git a/roles/matrix-synapse/tasks/ext/appservice-discord/setup.yml b/roles/matrix-bridge-appservice-discord/tasks/setup-install.yml similarity index 68% rename from roles/matrix-synapse/tasks/ext/appservice-discord/setup.yml rename to roles/matrix-bridge-appservice-discord/tasks/setup-install.yml index 9589477a..cbeb27b5 100644 --- a/roles/matrix-synapse/tasks/ext/appservice-discord/setup.yml +++ b/roles/matrix-bridge-appservice-discord/tasks/setup-install.yml @@ -1,17 +1,24 @@ --- + +# If the matrix-synapse role is not used, `matrix_synapse_role_executed` won't exist. +# We don't want to fail in such cases. +- name: Fail if matrix-synapse role already executed + fail: + msg: >- + The matrix-bridge-appservice-discord role needs to execute before the matrix-synapse role. + when: "matrix_synapse_role_executed|default(False)" + - name: Ensure Appservice Discord image is pulled docker_image: name: "{{ matrix_appservice_discord_docker_image }}" - when: "matrix_appservice_discord_enabled" -- name: Ensure Appservice Discord configuration path exists +- name: Ensure Appservice Discord base directory exists file: path: "{{ matrix_appservice_discord_base_path }}" state: directory mode: 0750 owner: "{{ matrix_user_username }}" group: "{{ matrix_user_username }}" - when: "matrix_appservice_discord_enabled" - name: Ensure Matrix Appservice Discord config installed copy: @@ -20,26 +27,23 @@ mode: 0644 owner: "{{ matrix_user_username }}" group: "{{ matrix_user_username }}" - when: "matrix_appservice_discord_enabled" - name: Ensure matrix-appservice-discord.service installed template: - src: "{{ role_path }}/templates/ext/appservice-discord/systemd/matrix-appservice-discord.service.j2" + src: "{{ role_path }}/templates/systemd/matrix-appservice-discord.service.j2" dest: "/etc/systemd/system/matrix-appservice-discord.service" mode: 0644 register: matrix_appservice_discord_systemd_service_result - when: "matrix_appservice_discord_enabled" - name: Ensure systemd reloaded after matrix-appservice-discord.service installation service: daemon_reload: yes - when: "matrix_appservice_discord_enabled and matrix_appservice_discord_systemd_service_result.changed" + when: "matrix_appservice_discord_systemd_service_result.changed" - name: Check if a matrix-appservice-discord registration file exists stat: path: "{{ matrix_appservice_discord_base_path }}/discord-registration.yaml" register: appservice_discord_registration_file - when: "matrix_appservice_discord_enabled" - name: Generate matrix-appservice-discord discord-registration.yaml if it doesn't exist shell: >- @@ -54,17 +58,15 @@ -c /data/config.yaml -f /data/discord-registration.yaml -l discord_bot - when: "matrix_appservice_discord_enabled and not appservice_discord_registration_file.stat.exists" + when: "not appservice_discord_registration_file.stat.exists" - set_fact: matrix_synapse_app_service_config_file_appservice_discord: '{{ matrix_appservice_discord_base_path }}/discord-registration.yml' - when: "matrix_appservice_discord_enabled" - name: Check if a matrix-appservice-discord invite_link file exists stat: path: "{{ matrix_appservice_discord_base_path }}/invite_link" register: appservice_discord_link_generated - when: "matrix_appservice_discord_enabled" - name: Generate your discord invite link shell: >- @@ -75,28 +77,17 @@ -w /data {{ matrix_appservice_discord_docker_image }} /bin/sh -c "node .././build/tools/addbot.js > invite_link" - when: "matrix_appservice_discord_enabled and not appservice_discord_link_generated.stat.exists" + when: "not appservice_discord_link_generated.stat.exists" +# If the matrix-synapse role is not used, these variables may not exist. - set_fact: matrix_synapse_container_additional_volumes: > - {{ matrix_synapse_container_additional_volumes }} + {{ matrix_synapse_container_additional_volumes|default([]) }} + {{ [{'src': '{{ matrix_appservice_discord_base_path }}/discord-registration.yaml', 'dst': '{{ matrix_synapse_app_service_config_file_appservice_discord }}', 'options': 'ro'}] }} - when: "matrix_appservice_discord_enabled" -- set_fact: matrix_synapse_app_service_config_files: > - {{ matrix_synapse_app_service_config_files }} + {{ matrix_synapse_app_service_config_files|default([]) }} + {{ ["{{ matrix_synapse_app_service_config_file_appservice_discord }}"] | to_nice_json }} - when: "matrix_appservice_discord_enabled" -# -# Tasks related to getting rid of matrix-appservice-discord (if it was previously enabled) -# - -- name: Ensure matrix-appservice-discord.service doesn't exist - file: - path: "/etc/systemd/system/matrix-appservice-discord.service" - state: absent - when: "not matrix_appservice_discord_enabled" diff --git a/roles/matrix-bridge-appservice-discord/tasks/setup-uninstall.yml b/roles/matrix-bridge-appservice-discord/tasks/setup-uninstall.yml new file mode 100644 index 00000000..35df8e51 --- /dev/null +++ b/roles/matrix-bridge-appservice-discord/tasks/setup-uninstall.yml @@ -0,0 +1,6 @@ +--- + +- name: Ensure matrix-appservice-discord.service doesn't exist + file: + path: "/etc/systemd/system/matrix-appservice-discord.service" + state: absent diff --git a/roles/matrix-bridge-appservice-discord/tasks/validate_config.yml b/roles/matrix-bridge-appservice-discord/tasks/validate_config.yml new file mode 100644 index 00000000..0afe9a0d --- /dev/null +++ b/roles/matrix-bridge-appservice-discord/tasks/validate_config.yml @@ -0,0 +1,10 @@ +--- + +- name: Fail if required settings not defined + fail: + msg: >- + You need to define a required configuration setting (`{{ item }}`). + when: "vars[item] == ''" + with_items: + - "matrix_appservice_discord_client_id" + - "matrix_appservice_discord_bot_token" diff --git a/roles/matrix-synapse/templates/ext/appservice-discord/systemd/matrix-appservice-discord.service.j2 b/roles/matrix-bridge-appservice-discord/templates/systemd/matrix-appservice-discord.service.j2 similarity index 71% rename from roles/matrix-synapse/templates/ext/appservice-discord/systemd/matrix-appservice-discord.service.j2 rename to roles/matrix-bridge-appservice-discord/templates/systemd/matrix-appservice-discord.service.j2 index 93449132..627c7ed6 100644 --- a/roles/matrix-synapse/templates/ext/appservice-discord/systemd/matrix-appservice-discord.service.j2 +++ b/roles/matrix-bridge-appservice-discord/templates/systemd/matrix-appservice-discord.service.j2 @@ -1,10 +1,13 @@ #jinja2: lstrip_blocks: "True" [Unit] Description=Matrix Appservice Discord server -After=docker.service -Requires=docker.service -Requires=matrix-synapse.service -After=matrix-synapse.service +{% for service in matrix_appservice_discord_systemd_required_services_list %} +Requires={{ service }} +After={{ service }} +{% endfor %} +{% for service in matrix_appservice_discord_systemd_wanted_services_list %} +Wants={{ service }} +{% endfor %} [Service] Type=simple @@ -20,6 +23,9 @@ ExecStart=/usr/bin/docker run --rm --name matrix-appservice-discord \ -p 127.0.0.1:9005:9005 \ {% endif %} -v {{ matrix_appservice_discord_base_path }}:/data \ + {% for arg in matrix_appservice_discord_container_extra_arguments %} + {{ arg }} \ + {% endfor %} {{ matrix_appservice_discord_docker_image }} ExecStop=-/usr/bin/docker kill matrix-appservice-discord diff --git a/roles/matrix-synapse/defaults/main.yml b/roles/matrix-synapse/defaults/main.yml index 21a02a0c..806a879d 100644 --- a/roles/matrix-synapse/defaults/main.yml +++ b/roles/matrix-synapse/defaults/main.yml @@ -238,129 +238,6 @@ matrix_s3_media_store_region: "eu-central-1" # Controls whether the self-check feature should validate SSL certificates. matrix_synapse_self_check_validate_certificates: true - -# Matrix Appservice Discord is a Matrix <-> Discord bridge -# Enable Discord bridge -matrix_appservice_discord_enabled: false - -matrix_appservice_discord_docker_image: "halfshot/matrix-appservice-discord:latest" - -matrix_appservice_discord_base_path: "{{ matrix_base_data_path }}/appservice-discord" - -matrix_appservice_discord_client_id: "YOUR DISCORD APP CLIENT ID" -matrix_appservice_discord_bot_token: "YOUR DISCORD APP BOT TOKEN" - -# Controls whether the Appservice Discord container exposes the Client/Server API port (tcp/9005). -matrix_appservice_discord_container_expose_client_server_api_port: false - -matrix_appservice_discord_configuration_yaml: | - bridge: - domain: "{{ matrix_domain }}" - homeserverUrl: "{{ matrix_homeserver_url }}" - auth: - clientID: "{{matrix_appservice_discord_client_id}}" - botToken: "{{matrix_appservice_discord_bot_token}}" - database: - filename: "/data/discord.db" - userStorePath: "/data/user-store.db" - roomStorePath: "/data/room-store.db" - -matrix_appservice_discord_configuration_extension_yaml: | - # This is a sample of the config file showing all avaliable options. - # Where possible we have documented what they do, and all values are the - # default values. - # - #bridge: - # # Domain part of the bridge, e.g. matrix.org - # domain: "localhost" - # # This should be your publically facing URL because Discord may use it to - # # fetch media from the media store. - # homeserverUrl: "http://localhost:8008" - # # Interval at which to process users in the 'presence queue'. If you have - # # 5 users, one user will be processed every 500 milliseconds according to the - # # value below. This has a minimum value of 250. - # # WARNING: This has a high chance of spamming the homeserver with presence - # # updates since it will send one each time somebody changes state or is online. - # presenceInterval: 500 - # # Disable setting presence for 'ghost users' which means Discord users on Matrix - # # will not be shown as away or online. - # disablePresence: false - # # Disable sending typing notifications when somebody on Discord types. - # disableTypingNotifications: false - # # Disable deleting messages on Discord if a message is redacted on Matrix. - # disableDeletionForwarding: false - # # Enable users to bridge rooms using !discord commands. See - # # https://t2bot.io/discord for instructions. - # enableSelfServiceBridging: false - # # Disable sending of read receipts for Matrix events which have been - # # successfully bridged to Discord. - # disableReadReceipts: false - # Authentication configuration for the discord bot. - #auth: - # clientID: "12345" - # botToken: "foobar" - #logging: - # # What level should the logger output to the console at. - # console: "warn" #silly, verbose, info, http, warn, error, silent - # lineDateFormat: "MMM-D HH:mm:ss.SSS" # This is in moment.js format - # files: - # - file: "debug.log" - # disable: - # - "PresenceHandler" # Will not capture presence logging - # - file: "warn.log" # Will capture warnings - # level: "warn" - # - file: "botlogs.log" # Will capture logs from DiscordBot - # level: "info" - # enable: - # - "DiscordBot" - #database: - # userStorePath: "user-store.db" - # roomStorePath: "room-store.db" - # # You may either use SQLite or Postgresql for the bridge database, which contains - # # important mappings for events and user puppeting configurations. - # # Use the filename option for SQLite, or connString for Postgresql. - # # If you are migrating, see https://github.com/Half-Shot/matrix-appservice-discord/blob/master/docs/howto.md#migrate-to-postgres-from-sqlite - # # WARNING: You will almost certainly be fine with sqlite unless your bridge - # # is in heavy demand and you suffer from IO slowness. - # filename: "discord.db" - # # connString: "postgresql://user:password@localhost/database_name" - #room: - # # Set the default visibility of alias rooms, defaults to "public". - # # One of: "public", "private" - # defaultVisibility: "public" - #channel: - # # Pattern of the name given to bridged rooms. - # # Can use :guild for the guild name and :name for the channel name. - # namePattern: "[Discord] :guild :name" - # # Changes made to rooms when a channel is deleted. - # deleteOptions: - # # Prefix the room name with a string. - # #namePrefix: "[Deleted]" - # # Prefix the room topic with a string. - # #topicPrefix: "This room has been deleted" - # # Disable people from talking in the room by raising the event PL to 50 - # disableMessaging: false - # # Remove the discord alias from the room. - # unsetRoomAlias: true - # # Remove the room from the directory. - # unlistFromDirectory: true - # # Set the room to be unavaliable for joining without an invite. - # setInviteOnly: true - # # Make all the discord users leave the room. - # ghostsLeave: true - #limits: - # # Delay in milliseconds between discord users joining a room. - # roomGhostJoinDelay: 6000 - # # Delay in milliseconds before sending messages to discord to avoid echos. - # # (Copies of a sent message may arrive from discord before we've - # # fininished handling it, causing us to echo it back to the room) - # discordSendDelay: 750 - -matrix_appservice_discord_configuration_extension: "{{ matrix_appservice_discord_configuration_extension_yaml|from_yaml if matrix_appservice_discord_configuration_extension_yaml|from_yaml else {} }}" - -matrix_appservice_discord_configuration: "{{ matrix_appservice_discord_configuration_yaml|from_yaml|combine(matrix_appservice_discord_configuration_extension, recursive=True) }}" - - # Controls whether searching the public room list is enabled. matrix_enable_room_list_search: true diff --git a/roles/matrix-synapse/tasks/ext/init.yml b/roles/matrix-synapse/tasks/ext/init.yml deleted file mode 100644 index ac3fd5ba..00000000 --- a/roles/matrix-synapse/tasks/ext/init.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- - -- import_tasks: "{{ role_path }}/tasks/ext/appservice-discord/init.yml" diff --git a/roles/matrix-synapse/tasks/ext/setup.yml b/roles/matrix-synapse/tasks/ext/setup.yml index 33b8dfc4..b3ee9eb6 100644 --- a/roles/matrix-synapse/tasks/ext/setup.yml +++ b/roles/matrix-synapse/tasks/ext/setup.yml @@ -5,5 +5,3 @@ - import_tasks: "{{ role_path }}/tasks/ext/shared-secret-auth/setup.yml" - import_tasks: "{{ role_path }}/tasks/ext/ldap-auth/setup.yml" - -- import_tasks: "{{ role_path }}/tasks/ext/appservice-discord/setup.yml" diff --git a/roles/matrix-synapse/tasks/init.yml b/roles/matrix-synapse/tasks/init.yml index ede7105d..753f3223 100644 --- a/roles/matrix-synapse/tasks/init.yml +++ b/roles/matrix-synapse/tasks/init.yml @@ -4,5 +4,3 @@ - set_fact: matrix_systemd_services_list: "{{ matrix_systemd_services_list + ['matrix-goofys'] }}" when: matrix_s3_media_store_enabled - -- import_tasks: "{{ role_path }}/tasks/ext/init.yml" \ No newline at end of file diff --git a/setup.yml b/setup.yml index 973a062f..ecb211e3 100755 --- a/setup.yml +++ b/setup.yml @@ -8,6 +8,7 @@ - matrix-mailer - matrix-postgres - matrix-corporal + - matrix-bridge-appservice-discord - matrix-bridge-appservice-irc - matrix-bridge-mautrix-facebook - matrix-bridge-mautrix-telegram