Skip to content

Commit

Permalink
Add reactions to slack connector (opsdroid#742)
Browse files Browse the repository at this point in the history
  • Loading branch information
jacobtomlinson authored and FabioRosado committed Dec 18, 2018
1 parent 0839407 commit dc3e60a
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 3 deletions.
25 changes: 22 additions & 3 deletions opsdroid/connector/slack/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

import aiohttp
import websockets
from emoji import demojize
import slacker
from aioslacker import Slacker

from opsdroid.connector import Connector
Expand Down Expand Up @@ -110,18 +112,35 @@ async def process_message(self, message):
await self.opsdroid.parse(Message(message["text"],
user_info["name"],
message["channel"],
self))
self,
raw_message=message))

async def respond(self, message, room=None):
"""Respond with a message."""
_LOGGER.debug("Responding with: '" + message.text +
"' in room " + message.room)
_LOGGER.debug("Responding with: '%s' in room %s",
message.text, message.room)
await self.slacker.chat.post_message(message.room,
message.text,
as_user=False,
username=self.bot_name,
icon_emoji=self.icon_emoji)

async def react(self, message, emoji):
"""React to a message."""
emoji = demojize(emoji)
_LOGGER.debug("Reacting with: %s", emoji)
try:
await self.slacker.reactions.post('reactions.add', data={
'name': emoji,
'channel': message.room,
'timestamp': message.raw_message['ts']
})
except slacker.Error as error:
if str(error) == 'invalid_name':
_LOGGER.warning('Slack does not support the emoji %s', emoji)
else:
raise

async def keepalive_websocket(self):
"""Keep pinging the websocket to keep it alive."""
while self.listening:
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ aiosqlite==0.8.0
arrow==0.12.1
Babel==2.6.0
click==7.0
emoji==0.5.1
nbconvert==5.4.0
nbformat==4.4.0
pycron==1.0.0
Expand Down
24 changes: 24 additions & 0 deletions tests/test_connector_slack.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,30 @@ async def test_respond(self):
await connector.respond(Message("test", "user", "room", connector))
self.assertTrue(connector.slacker.chat.post_message.called)

async def test_react(self):
connector = ConnectorSlack({"api-token": "abc123"})
connector.slacker.reactions.post = amock.CoroutineMock()
await connector.react(Message("test", "user", "room", connector, {'ts': 0}), "😀")
self.assertTrue(connector.slacker.reactions.post)
self.assertEqual(
connector.slacker.reactions.post.call_args[1]['data']['name'],
':grinning_face:')

async def test_react_invalid_name(self):
import slacker
connector = ConnectorSlack({"api-token": "abc123"})
connector.slacker.reactions.post = amock.CoroutineMock(side_effect=slacker.Error('invalid_name'))
with amock.patch('opsdroid.connector.slack._LOGGER.warning',) as logmock:
await connector.react(Message("test", "user", "room", connector, {'ts': 0}), "😀")
self.assertTrue(logmock.called)

async def test_react_unknown_error(self):
import slacker
connector = ConnectorSlack({"api-token": "abc123"})
connector.slacker.reactions.post = amock.CoroutineMock(side_effect=slacker.Error('unknown'))
with self.assertRaises(slacker.Error):
await connector.react(Message("test", "user", "room", connector, {'ts': 0}), "😀")

async def test_reconnect(self):
connector = ConnectorSlack({"api-token": "abc123"})
connector.connect = amock.CoroutineMock()
Expand Down

0 comments on commit dc3e60a

Please sign in to comment.