Skip to content

Commit 590c04b

Browse files
clsungbe-hase
authored andcommitted
add ThingsEvent, for things-compatible device link/unlink event (#153)
- implement #143
1 parent a10647b commit 590c04b

File tree

5 files changed

+117
-16
lines changed

5 files changed

+117
-16
lines changed

linebot/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
MemberJoinedEvent,
4949
MemberLeftEvent,
5050
BeaconEvent,
51+
ThingsEvent,
5152
Postback,
5253
Beacon,
5354
Link,

linebot/models/events.py

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

358358

359+
class ThingsEvent(Event):
360+
"""Webhook ThingsEvent.
361+
362+
https://developers.line.biz/en/reference/messaging-api/#device-link-event
363+
364+
Indicates that a LINE Things-compatible device has been linked with LINE by
365+
a user operation.
366+
"""
367+
368+
def __init__(self, timestamp=None, source=None, reply_token=None, things=None, **kwargs):
369+
"""__init__ method.
370+
371+
:param long timestamp: Time of the event in milliseconds
372+
:param source: Source object
373+
:type source: T <= :py:class:`linebot.models.sources.Source`
374+
:param str reply_token: Reply token
375+
:param things: Things object
376+
:type things: :py:class:`linebot.models.events.Things`
377+
:param kwargs:
378+
"""
379+
super(ThingsEvent, self).__init__(
380+
timestamp=timestamp, source=source, **kwargs
381+
)
382+
383+
self.type = 'things'
384+
self.reply_token = reply_token
385+
self.things = self.get_or_new_from_json_dict(
386+
things, Things
387+
)
388+
389+
359390
class Postback(Base):
360391
"""Postback.
361392
@@ -467,3 +498,21 @@ def __init__(self, result=None, nonce=None, **kwargs):
467498

468499
self.result = result
469500
self.nonce = nonce
501+
502+
503+
class Things(Base):
504+
"""Things.
505+
506+
https://developers.line.biz/en/docs/line-things/develop-bot/#link-event
507+
"""
508+
509+
def __init__(self, device_id=None, type=None, **kwargs):
510+
"""__init__ method.
511+
512+
:param str device_id: Device ID of the device that was linked with LINE.
513+
:param str type: link or unlink
514+
"""
515+
super(Things, self).__init__(**kwargs)
516+
517+
self.device_id = device_id
518+
self.type = type

linebot/webhook.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
AccountLinkEvent,
3535
MemberJoinedEvent,
3636
MemberLeftEvent,
37+
ThingsEvent,
3738
)
3839
from .utils import LOGGER, PY3, safe_compare_digest
3940

@@ -150,6 +151,8 @@ def parse(self, body, signature):
150151
events.append(MemberJoinedEvent.new_from_json_dict(event))
151152
elif event_type == 'memberLeft':
152153
events.append(MemberLeftEvent.new_from_json_dict(event))
154+
elif event_type == 'things':
155+
events.append(ThingsEvent.new_from_json_dict(event))
153156
else:
154157
LOGGER.warn('Unknown event type. type=' + event_type)
155158

tests/test_webhook.py

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from linebot.models import (
2525
MessageEvent, FollowEvent, UnfollowEvent, JoinEvent,
2626
LeaveEvent, PostbackEvent, BeaconEvent, AccountLinkEvent,
27-
MemberJoinedEvent, MemberLeftEvent,
27+
MemberJoinedEvent, MemberLeftEvent, ThingsEvent,
2828
TextMessage, ImageMessage, VideoMessage, AudioMessage,
2929
LocationMessage, StickerMessage, FileMessage,
3030
SourceUser, SourceRoom, SourceGroup
@@ -304,20 +304,16 @@ def test_parse(self):
304304
self.assertEqual(events[18].postback.data, 'action=buyItem&itemId=123123&color=red')
305305
self.assertEqual(events[18].postback.params['datetime'], '2013-04-01T10:00')
306306

307-
# MessageEvent, SourceUser, FileMessage
308-
self.assertIsInstance(events[19], MessageEvent)
307+
# ThingsEvent, SourceUser, link
308+
self.assertIsInstance(events[19], ThingsEvent)
309309
self.assertEqual(events[19].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
310-
self.assertEqual(events[19].type, 'message')
310+
self.assertEqual(events[19].type, 'things')
311311
self.assertEqual(events[19].timestamp, 1462629479859)
312312
self.assertIsInstance(events[19].source, SourceUser)
313313
self.assertEqual(events[19].source.type, 'user')
314314
self.assertEqual(events[19].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
315-
self.assertEqual(events[19].source.sender_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
316-
self.assertIsInstance(events[19].message, FileMessage)
317-
self.assertEqual(events[19].message.id, '325708')
318-
self.assertEqual(events[19].message.type, 'file')
319-
self.assertEqual(events[19].message.file_name, "file.txt")
320-
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')
321317

322318
# MemberJoinedEvent
323319
self.assertIsInstance(events[20], MemberJoinedEvent)
@@ -344,6 +340,32 @@ def test_parse(self):
344340
self.assertEqual(events[21].left.members[0].user_id, 'U4af4980629...')
345341
self.assertEqual(events[21].left.members[1].user_id, 'U91eeaf62d9...')
346342

343+
# ThingsEvent, SourceUser, unlink
344+
self.assertIsInstance(events[22], ThingsEvent)
345+
self.assertEqual(events[22].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
346+
self.assertEqual(events[22].type, 'things')
347+
self.assertEqual(events[22].timestamp, 1462629479859)
348+
self.assertIsInstance(events[22].source, SourceUser)
349+
self.assertEqual(events[22].source.type, 'user')
350+
self.assertEqual(events[22].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
351+
self.assertEqual(events[22].things.device_id, 't2c449c9d1')
352+
self.assertEqual(events[22].things.type, 'unlink')
353+
354+
# MessageEvent, SourceUser, FileMessage
355+
self.assertIsInstance(events[23], MessageEvent)
356+
self.assertEqual(events[23].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
357+
self.assertEqual(events[23].type, 'message')
358+
self.assertEqual(events[23].timestamp, 1462629479859)
359+
self.assertIsInstance(events[23].source, SourceUser)
360+
self.assertEqual(events[23].source.type, 'user')
361+
self.assertEqual(events[23].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
362+
self.assertEqual(events[23].source.sender_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
363+
self.assertIsInstance(events[23].message, FileMessage)
364+
self.assertEqual(events[23].message.id, '325708')
365+
self.assertEqual(events[23].message.type, 'file')
366+
self.assertEqual(events[23].message.file_name, "file.txt")
367+
self.assertEqual(events[23].message.file_size, 2138)
368+
347369

348370
class TestWebhookHandler(unittest.TestCase):
349371
def setUp(self):

tests/text/webhook.json

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,17 +248,15 @@
248248
},
249249
{
250250
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
251-
"type": "message",
251+
"type": "things",
252252
"timestamp": 1462629479859,
253253
"source": {
254254
"type": "user",
255255
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
256256
},
257-
"message": {
258-
"id": "325708",
259-
"type": "file",
260-
"fileName": "file.txt",
261-
"fileSize": 2138
257+
"things": {
258+
"deviceId": "t2c449c9d1",
259+
"type": "link"
262260
}
263261
},
264262
{
@@ -301,6 +299,34 @@
301299
}
302300
]
303301
}
302+
},
303+
{
304+
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
305+
"type": "things",
306+
"timestamp": 1462629479859,
307+
"source": {
308+
"type": "user",
309+
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
310+
},
311+
"things": {
312+
"deviceId": "t2c449c9d1",
313+
"type": "unlink"
314+
}
315+
},
316+
{
317+
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
318+
"type": "message",
319+
"timestamp": 1462629479859,
320+
"source": {
321+
"type": "user",
322+
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
323+
},
324+
"message": {
325+
"id": "325708",
326+
"type": "file",
327+
"fileName": "file.txt",
328+
"fileSize": 2138
329+
}
304330
}
305331
]
306332
}

0 commit comments

Comments
 (0)