Discord Sync: sync a Discourse forum with a Discord server

Is there any wat that you can sync the discord roles with discourse, instead of sync discourse roles with discord?

That’s the point of this plugin? Is it broken? Also take a look at my bot plugin linked in the OP which performs discourse → discord (albeit using bot command)


All plugins here, gives you the roles you have on discourse to your discord account. It doesn’t gives you, your discord roles on your discourse account.

That’s the opposite of your original question?

@spirobel ’s plugin does that I believe?


No, it does example if you have “Community Moderator” in Discourse, it will change your discord role.
But if you have “Community Moderator” in Discord, it won’t change your role in Discourse


I think you may have missed what I was referring to: Discord Sync: sync a Discourse forum with a Discord server - #17 by spirobel

Over to you @spirobel


I missed that, his plugin is a custom made plugin for 400 usd

1 Like

is he actually selling that for 400$? that’s ridiculous.

1 Like

ridiculously cheap. There are not many people interested in this usecase that are willing to pay money for it. It takes time to research these topics, write and maintain the software. That is not for free and if there are not many customers the price reflects that.
The other issue is: the lower the price the more demanding the customers. I just dont have the time to deal with support issues and questions of people that paid 25$ for it.
If you have a suggestion how I can make money and not get hassled while selling at a low pricepoint, please let me know.


Yeah, I remember reaching out about using their plugin, and I can totally see why they would want to charge how much they do. I know that plenty of communities can afford that price point but, it isn’t necessarily affordable for smaller communities.

I ended up making my own solution by adding to my Discord bot (Java based since I don’t think I could easily do this entirely via a Discourse plugin, at least not yet), which has the added functionality of some bidirectional logic. In the future, I am hoping to make this feature available to the public once my Discord bot is finished, but that will depend on how much free time I have. Here’s my bot in action in case anyone wants to take a look: https://p185.p2.n0.cdn.getcloudapp.com/items/4guZZEP1/b138570f-071c-4373-ada5-b7ed2cd63b26.mp4

Also, if anyone would be interested in being a beta tester for once I make this public, feel free to send me a DM - I don’t have an ETA on when I’ll have something working but, I might consider making this a standalone feature if needed.


You realise a Discourse Discord Bot framework already exists here that you can fork, modify and extend? Discord Bot Construction Kit 🤖. It does 99% of the housekeeping so you can focus on the functional side (it evens runs on your Discourse server so no additional infrastructure is required). The existing features act as a guide to whatever you want to add.

I would also accept PRs if you came up with anything useful to other communities.


I think I did see that - I just am not familiar with Ruby so, I just added the feature directly to my bot that I was already working on for years before using Discourse. I definitely would consider doing a PR for that but, when I wrote this feature for my community I was on a time crunch so learning Ruby was out of the question. I’d definitely consider taking on Ruby as my next programming language and give this a shot though! :grinning:

Edit: Also thank you for bringing up that it is easily customizable - I didn’t realize that at first. I just got intimidated when I last attempted to modify a Discourse plugin lol


Give Ruby a chance, it’s actually a fun programming language :slight_smile:


I’m having issue while testing this plugin after all setting up during the testing getting some permission error.
Discordrb::Errors::NoPermission (The bot doesn’t have the required permission to do this!) lib/promotion.rb:136:in recalculate' app/models/group_user.rb:117:in recalculate_trust_level’

Attaching screenshot for reference:

Could anyone help me here ?


Does your Discord bot have permissions set properly? You’d need the bot to be above any roles that it would be assigning, and would need to have the Manage Roles or Administrator permission on the bot’s role.

1 Like

yes, We have provided all the permission including Administrator, Manage Roles, Manage Nicknames.

Is that role above all other roles that it would be assigning?

This plugin is not enabled on our server, but causing errors in the logs.

gateway_check Error

discordrb (3.3.0) lib/discordrb/bot.rb:673:in `gateway_check’

discordrb (3.3.0) lib/discordrb/bot.rb:156:in `servers’

plugins/discourse-discord-sync/lib/utils.rb:72:in `sync_user’

plugins/discourse-discord-sync/plugin.rb:42:in `block (3 levels) in activate!’

activesupport ( lib/active_support/callbacks.rb:427:in `instance_exec’

activesupport ( lib/active_support/callbacks.rb:427:in `block in make_lambda’

activesupport ( lib/active_support/callbacks.rb:235:in `block in halting_and_conditional’

activesupport ( lib/active_support/callbacks.rb:516:in `block in invoke_after’

activesupport ( lib/active_support/callbacks.rb:516:in `each’

activesupport ( lib/active_support/callbacks.rb:516:in `invoke_after’

activesupport ( lib/active_support/callbacks.rb:131:in `block in run_callbacks’

activesupport ( lib/active_support/callbacks.rb:137:in `run_callbacks’

activesupport ( lib/active_support/callbacks.rb:824:in `_run_save_callbacks’

activerecord ( lib/active_record/callbacks.rb:457:in `create_or_update’

activerecord ( lib/active_record/timestamp.rb:126:in `create_or_update’

activerecord ( lib/active_record/persistence.rb:474:in `save’

activerecord ( lib/active_record/validations.rb:47:in `save’

activerecord ( lib/active_record/transactions.rb:298:in `block in save’

activerecord ( lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status’

activerecord ( lib/active_record/connection_adapters/abstract/database_statements.rb:318:in `transaction’

activerecord ( lib/active_record/transactions.rb:350:in `with_transaction_returning_status’

activerecord ( lib/active_record/transactions.rb:298:in `save’

activerecord ( lib/active_record/suppressor.rb:44:in `save’

activerecord ( lib/active_record/persistence.rb:628:in `block in update’

activerecord ( lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status’

activerecord ( lib/active_record/connection_adapters/abstract/database_statements.rb:318:in `transaction’

activerecord ( lib/active_record/transactions.rb:350:in `with_transaction_returning_status’

activerecord ( lib/active_record/persistence.rb:626:in `update’

lib/post_creator.rb:613:in `update_user_counts’

lib/post_creator.rb:214:in `block in create’

lib/post_creator.rb:408:in `block (2 levels) in transaction’

activerecord ( lib/active_record/connection_adapters/abstract/database_statements.rb:320:in `block in transaction’

activerecord ( lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction’

activesupport ( lib/active_support/concurrency/load_interlock_aware_monitor.rb:26:in `block (2 levels) in synchronize’

activesupport ( lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt’

activesupport ( lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize’

activesupport ( lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt’

activesupport ( lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize’

activerecord ( lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction’

activerecord ( lib/active_record/connection_adapters/abstract/database_statements.rb:320:in `transaction’

activerecord ( lib/active_record/transactions.rb:209:in `transaction’

lib/post_creator.rb:407:in `block in transaction’

lib/distributed_mutex.rb:33:in `block in synchronize’

lib/distributed_mutex.rb:29:in `synchronize’

lib/distributed_mutex.rb:29:in `synchronize’

lib/distributed_mutex.rb:14:in `synchronize’

lib/post_creator.rb:406:in `transaction’

lib/post_creator.rb:204:in `create’

lib/new_post_manager.rb:285:in `perform_create_post’

lib/new_post_manager.rb:223:in `perform’

app/controllers/posts_controller.rb:197:in `create’

actionpack ( lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action’

actionpack ( lib/abstract_controller/base.rb:228:in `process_action’

actionpack ( lib/action_controller/metal/rendering.rb:30:in `process_action’

actionpack ( lib/abstract_controller/callbacks.rb:42:in `block in process_action’

activesupport ( lib/active_support/callbacks.rb:117:in `block in run_callbacks’

app/controllers/application_controller.rb:387:in `block in with_resolved_locale’

i18n (1.9.1) lib/i18n.rb:328:in `with_locale’

app/controllers/application_controller.rb:387:in `with_resolved_locale’

activesupport ( lib/active_support/callbacks.rb:126:in `block in run_callbacks’

activesupport ( lib/active_support/callbacks.rb:137:in `run_callbacks’

actionpack ( lib/abstract_controller/callbacks.rb:41:in `process_action’

actionpack ( lib/action_controller/metal/rescue.rb:22:in `process_action’

actionpack ( lib/action_controller/metal/instrumentation.rb:34:in `block in process_action’

activesupport ( lib/active_support/notifications.rb:203:in `block in instrument’

activesupport ( lib/active_support/notifications/instrumenter.rb:24:in `instrument’

activesupport ( lib/active_support/notifications.rb:203:in `instrument’

actionpack ( lib/action_controller/metal/instrumentation.rb:33:in `process_action’

actionpack ( lib/action_controller/metal/params_wrapper.rb:249:in `process_action’

activerecord ( lib/active_record/railties/controller_runtime.rb:27:in `process_action’

actionpack ( lib/abstract_controller/base.rb:165:in `process’

actionview ( lib/action_view/rendering.rb:39:in `process’

rack-mini-profiler (2.3.3) lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method’

actionpack ( lib/action_controller/metal.rb:190:in `dispatch’

actionpack ( lib/action_controller/metal.rb:254:in `dispatch’

actionpack ( lib/action_dispatch/routing/route_set.rb:50:in `dispatch’

actionpack ( lib/action_dispatch/routing/route_set.rb:33:in `serve’

actionpack ( lib/action_dispatch/journey/router.rb:50:in `block in serve’

actionpack ( lib/action_dispatch/journey/router.rb:32:in `each’

actionpack ( lib/action_dispatch/journey/router.rb:32:in `serve’

actionpack ( lib/action_dispatch/routing/route_set.rb:842:in `call’

lib/middleware/omniauth_bypass_middleware.rb:71:in `call’

rack (2.2.3) lib/rack/tempfile_reaper.rb:15:in `call’

rack (2.2.3) lib/rack/conditional_get.rb:40:in `call’

rack (2.2.3) lib/rack/head.rb:12:in `call’

actionpack ( lib/action_dispatch/http/permissions_policy.rb:22:in `call’

lib/content_security_policy/middleware.rb:12:in `call’

lib/middleware/anonymous_cache.rb:356:in `call’

rack (2.2.3) lib/rack/session/abstract/id.rb:266:in `context’

rack (2.2.3) lib/rack/session/abstract/id.rb:260:in `call’

actionpack ( lib/action_dispatch/middleware/cookies.rb:689:in `call’

actionpack ( lib/action_dispatch/middleware/callbacks.rb:27:in `block in call’

activesupport ( lib/active_support/callbacks.rb:98:in `run_callbacks’

actionpack ( lib/action_dispatch/middleware/callbacks.rb:26:in `call’

actionpack ( lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call’

actionpack ( lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call’

actionpack ( lib/action_dispatch/middleware/show_exceptions.rb:33:in `call’

logster (2.10.1) lib/logster/middleware/reporter.rb:43:in `call’

railties ( lib/rails/rack/logger.rb:37:in `call_app’

railties ( lib/rails/rack/logger.rb:28:in `call’

config/initializers/100-quiet_logger.rb:23:in `call’

config/initializers/100-silence_logger.rb:31:in `call’

actionpack ( lib/action_dispatch/middleware/remote_ip.rb:81:in `call’

actionpack ( lib/action_dispatch/middleware/request_id.rb:26:in `call’

lib/middleware/enforce_hostname.rb:23:in `call’

rack (2.2.3) lib/rack/method_override.rb:24:in `call’

actionpack ( lib/action_dispatch/middleware/executor.rb:14:in `call’

rack (2.2.3) lib/rack/sendfile.rb:110:in `call’

actionpack ( lib/action_dispatch/middleware/host_authorization.rb:92:in `call’

rack-mini-profiler (2.3.3) lib/mini_profiler/

yes, we have provided super admin!

Just to check - is this plugin still functional or should I put an unmaintained / broken tag on it?