One of the GSOC ideas on GitHub is creating a “Common Event System for Chatrooms”
I like the sound of this idea, so this is an attempt at a more comprehensive description of how it could be implemented. Hopefully this will give a starting point for some discussion about what people would like to get out of a feature like this.
Edit 17/03/2017: I've added and
What we already have
https://meta.discourse.org/t/the-official-discourse-slack-plugin/51412
The Discourse-Slack plugin is a great way of getting real-time notifications of Discourse posts. It can post to ‘group chats’ in Slack, or post to individuals. Notifications can be setup for specific categories (tags coming soon), either for “new topics”, or “all replies”.
Common event system
The idea
Creating plugins which provide similar functionality to the slack plugin, but for other communication platforms, is totally possible right now. However, this will result in a massive amount of code duplication, as a lot of the logic will be the same between different chat systems. Therefore a ‘shared’ chat system (as a plugin), would be an efficient & maintainable way to expand to multiple platforms.
Scope
As an initial implementation, I wouldn’t expect functionality to go much further than the current functionality of the Slack plugin, however there is scope to add more functionality such as actually making posts on Discourse from your chosen messaging platform, but that’s material for a future discussion.
Structure
The “Common event system” would take care of managing “subscriptions” (which categories/tags to subscribe to for a given “chat”). At its simplest level, it would maintain a table with rows like this. Yes, it would need to be more complicated than 3 text fields, but hopefully this illustrates the functionality.
| CHAT_SYSTEM | CHAT_ID | SUBSCRIPTIONS |
|-------------|-----------------|---------------------------------|
| telegram | @davidtaylorhq | c/meta,c/plugins,t/pr-welcome |
| facebook | group_75462363 | c/lounge |
| slack | #general | c/support, c/bugs |
Each of the chat_systems would be an independent plugin, which deals with the platform-specific stuff. These plugins would receive information from the “common event system” using similar systems as the current event hooks. So you’d end up with something like:
DiscourseEvent.on(:notify_chat, :telegram) do |information|
# Send a message to the specified telegram chat using the information provided
end
Permissions
Initially this would be admin-only, so no permission checks would be necessary
Authenticating
Initially this would be admin-only, so no authentication would be necessary
User Interface
The “common event system” should have its own pane in the admin interface, listing all current subscriptions (effectively each of the rows in the pseudo-table above). I imagine the UI to be very similar to the current slack plugin:
Providers could also implement something like “slash commands” for changing subscription settings, like the slack plugin does right now:
/discourse [watch|follow|mute|help|status] [category|all]
Possible providers
Each of these could be implemented in separate plugins, keeping things modular & maintainable:
Slack - the slack plugin already exists, making use of the api
Telegram - Mature REST bot API, which I have used in the past.
Facebook Messenger - Bot API available
Gitter - Can add things to ‘activity stream’ using the services library. @jafeth.diazc has more info here
HipChat (thread) - API available, see discourse-akismet-hipchat
Mattermost (thread) - API available
[others] - Hopefully having a central system for managing the complicated user/permissions logic would enable plugin developers to easily create plugins for any service with an API.
I'd love to hear people's thoughts on this spec, if there's anything that's not clear please let me know and I'll do my best to improve the description.