Class: Kamigo::EventParsers::LineEventParser

Inherits:
Object
  • Object
show all
Includes:
Clients::LineClient
Defined in:
lib/kamigo/event_parsers/line_event_parser.rb

Instance Method Summary collapse

Methods included from Clients::LineClient

#client, #validate_signature

Instance Method Details

#get_profile(line_event) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/kamigo/event_parsers/line_event_parser.rb', line 29

def get_profile(line_event)
  case line_event.source_type
  when 'group'
    response = client.get_group_member_profile(
      line_event.source_group_id,
      line_event.source_user_id
    )
  when 'room'
    response = client.get_room_member_profile(
      line_event.source_group_id,
      line_event.source_user_id
    )
  else
    response = client.get_profile(line_event.source_user_id)
  end
  JSON.parse(response.body)
end

#parse(event) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/kamigo/event_parsers/line_event_parser.rb', line 14

def parse(event)
  event_hash = JSON.parse(event.to_json, symbolize_names: true)
  payload = event_hash[:src] || event_hash
  line_event = Kamigo::Events::LineEvent.new
  line_event.payload = payload
  line_event.reply_token = event['replyToken']
  line_event.source_type = payload.dig(:source, :type)
  line_event.source_group_id = payload.dig(:source, :groupId) || payload.dig(:source, :roomId) || payload.dig(:source, :userId)
  line_event.source_user_id = payload.dig(:source, :userId) || payload.dig(:source, :groupId) || payload.dig(:source, :roomId)
  line_event.message_type = payload.dig(:message, :type) || payload.dig(:type)
  line_event.message = payload.dig(:message, :text) || payload.dig(:postback, :data) || payload.dig(:message, :address) || line_event.message_type
  line_event.profile = get_profile(line_event)
  line_event
end

#parse_events(request) ⇒ Object



6
7
8
9
10
11
12
# File 'lib/kamigo/event_parsers/line_event_parser.rb', line 6

def parse_events(request)
  body = request.body.read
  events = client.parse_events_from(body)
  events.map do |event|
    parse(event)
  end
end