Skip to content

Commit c2b12fc

Browse files
committed
add ThingsEvent, for things-compatible device link/unlink event
- implement #143
1 parent 1b38bfc commit c2b12fc

File tree

5 files changed

+111
-9
lines changed

5 files changed

+111
-9
lines changed

linebot/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
PostbackEvent,
4747
AccountLinkEvent,
4848
BeaconEvent,
49+
ThingsEvent,
4950
Postback,
5051
Beacon,
5152
Link,

linebot/models/events.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,37 @@ def __init__(self, timestamp=None, source=None, reply_token=None, link=None, **k
294294
)
295295

296296

297+
class ThingsEvent(Event):
298+
"""Webhook ThingsEvent.
299+
300+
https://developers.line.biz/en/reference/messaging-api/#device-link-event
301+
302+
Indicates that a LINE Things-compatible device has been linked with LINE by
303+
a user operation.
304+
"""
305+
306+
def __init__(self, timestamp=None, source=None, reply_token=None, things=None, **kwargs):
307+
"""__init__ method.
308+
309+
:param long timestamp: Time of the event in milliseconds
310+
:param source: Source object
311+
:type source: T <= :py:class:`linebot.models.sources.Source`
312+
:param str reply_token: Reply token
313+
:param things: Things object
314+
:type things: :py:class:`linebot.models.events.Things`
315+
:param kwargs:
316+
"""
317+
super(ThingsEvent, self).__init__(
318+
timestamp=timestamp, source=source, **kwargs
319+
)
320+
321+
self.type = 'things'
322+
self.reply_token = reply_token
323+
self.things = self.get_or_new_from_json_dict(
324+
things, Things
325+
)
326+
327+
297328
class Postback(Base):
298329
"""Postback.
299330
@@ -361,3 +392,21 @@ def __init__(self, result=None, nonce=None, **kwargs):
361392

362393
self.result = result
363394
self.nonce = nonce
395+
396+
397+
class Things(Base):
398+
"""Things.
399+
400+
https://developers.line.biz/en/docs/line-things/develop-bot/#link-event
401+
"""
402+
403+
def __init__(self, device_id=None, type=None, **kwargs):
404+
"""__init__ method.
405+
406+
:param str device_id: Device ID of the device that was linked with LINE.
407+
:param str type: link or unlink
408+
"""
409+
super(Things, self).__init__(**kwargs)
410+
411+
self.device_id = device_id
412+
self.type = type

linebot/webhook.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
PostbackEvent,
3333
BeaconEvent,
3434
AccountLinkEvent,
35+
ThingsEvent,
3536
)
3637
from .utils import LOGGER, PY3, safe_compare_digest
3738

@@ -144,6 +145,8 @@ def parse(self, body, signature):
144145
events.append(BeaconEvent.new_from_json_dict(event))
145146
elif event_type == 'accountLink':
146147
events.append(AccountLinkEvent.new_from_json_dict(event))
148+
elif event_type == 'things':
149+
events.append(ThingsEvent.new_from_json_dict(event))
147150
else:
148151
LOGGER.warn('Unknown event type. type=' + event_type)
149152

tests/test_webhook.py

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from linebot.models import (
2525
MessageEvent, FollowEvent, UnfollowEvent, JoinEvent,
2626
LeaveEvent, PostbackEvent, BeaconEvent, AccountLinkEvent,
27+
ThingsEvent,
2728
TextMessage, ImageMessage, VideoMessage, AudioMessage,
2829
LocationMessage, StickerMessage, FileMessage,
2930
SourceUser, SourceRoom, SourceGroup
@@ -303,20 +304,42 @@ def test_parse(self):
303304
self.assertEqual(events[18].postback.data, 'action=buyItem&itemId=123123&color=red')
304305
self.assertEqual(events[18].postback.params['datetime'], '2013-04-01T10:00')
305306

306-
# MessageEvent, SourceUser, FileMessage
307-
self.assertIsInstance(events[19], MessageEvent)
307+
# ThingsEvent, SourceUser, link
308+
self.assertIsInstance(events[19], ThingsEvent)
308309
self.assertEqual(events[19].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
309-
self.assertEqual(events[19].type, 'message')
310+
self.assertEqual(events[19].type, 'things')
310311
self.assertEqual(events[19].timestamp, 1462629479859)
311312
self.assertIsInstance(events[19].source, SourceUser)
312313
self.assertEqual(events[19].source.type, 'user')
313314
self.assertEqual(events[19].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
314-
self.assertEqual(events[19].source.sender_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
315-
self.assertIsInstance(events[19].message, FileMessage)
316-
self.assertEqual(events[19].message.id, '325708')
317-
self.assertEqual(events[19].message.type, 'file')
318-
self.assertEqual(events[19].message.file_name, "file.txt")
319-
self.assertEqual(events[19].message.file_size, 2138)
315+
self.assertEqual(events[19].things.device_id, 't2c449c9d1')
316+
self.assertEqual(events[19].things.type, 'link')
317+
318+
# ThingsEvent, SourceUser, unlink
319+
self.assertIsInstance(events[20], ThingsEvent)
320+
self.assertEqual(events[20].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
321+
self.assertEqual(events[20].type, 'things')
322+
self.assertEqual(events[20].timestamp, 1462629479859)
323+
self.assertIsInstance(events[20].source, SourceUser)
324+
self.assertEqual(events[20].source.type, 'user')
325+
self.assertEqual(events[20].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
326+
self.assertEqual(events[20].things.device_id, 't2c449c9d1')
327+
self.assertEqual(events[20].things.type, 'unlink')
328+
329+
# MessageEvent, SourceUser, FileMessage
330+
self.assertIsInstance(events[21], MessageEvent)
331+
self.assertEqual(events[21].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
332+
self.assertEqual(events[21].type, 'message')
333+
self.assertEqual(events[21].timestamp, 1462629479859)
334+
self.assertIsInstance(events[21].source, SourceUser)
335+
self.assertEqual(events[21].source.type, 'user')
336+
self.assertEqual(events[21].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
337+
self.assertEqual(events[21].source.sender_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
338+
self.assertIsInstance(events[21].message, FileMessage)
339+
self.assertEqual(events[21].message.id, '325708')
340+
self.assertEqual(events[21].message.type, 'file')
341+
self.assertEqual(events[21].message.file_name, "file.txt")
342+
self.assertEqual(events[21].message.file_size, 2138)
320343

321344

322345
class TestWebhookHandler(unittest.TestCase):

tests/text/webhook.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,32 @@
246246
}
247247
}
248248
},
249+
{
250+
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
251+
"type": "things",
252+
"timestamp": 1462629479859,
253+
"source": {
254+
"type": "user",
255+
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
256+
},
257+
"things": {
258+
"deviceId": "t2c449c9d1",
259+
"type": "link"
260+
}
261+
},
262+
{
263+
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
264+
"type": "things",
265+
"timestamp": 1462629479859,
266+
"source": {
267+
"type": "user",
268+
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
269+
},
270+
"things": {
271+
"deviceId": "t2c449c9d1",
272+
"type": "unlink"
273+
}
274+
},
249275
{
250276
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
251277
"type": "message",

0 commit comments

Comments
 (0)