kamigo 0.14.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa6261bf0404dd6f3cdc88dce3f6ed5fd1b99240986f5523c980bf67be020a18
4
- data.tar.gz: a7936a209e8e7b7b0496e13efd9aee3ad7dc95b86c834dd447a09fc5c3a88197
3
+ metadata.gz: b0286bef7f7c96549005475052dd8346f44fe4e010a917322a6cdd3cbf654bee
4
+ data.tar.gz: d7d456254873fa6e5ae5c15e8e27801068ee7cf96c7caa0cedf61f9f996e2ceb
5
5
  SHA512:
6
- metadata.gz: d172ea63954894592d0dbad7823e0c9a6c47aa96acbb40078cf522e0b4be31dd3f167f4347d57a644e09cfd215c767a7d93f4ebd0d8c5515603f2ae56408bd3c
7
- data.tar.gz: df8dc0dc851a7ba5afa798b610c0574acf8602a16d4f81ebc7d97de82b37b42e83c8777207eb8eb0d554dcb11c93e5f3431b50b459eb631af45bcbeb2b5c157d
6
+ metadata.gz: a5aacaf96b30ea7c065c141fd279ace76d2e89ef087da6d609a95d8a24cf877fb40e25557e4903de0e2e37859f5a321a08c4a1dc3fab8bdb1e0f35fdbc20b6aa
7
+ data.tar.gz: d02be888e22755e6484caa313bda70384cf8bd7e2c503da4586aa0cb3394dfbbb293e9edf119f7c47f986d902958a742d12e6d81a74712b80c82e61527880372
@@ -1,14 +1,15 @@
1
1
  require 'uri'
2
2
 
3
3
  class LineController < ApplicationController
4
- include ReverseRoute
5
4
  protect_from_forgery with: :null_session
6
5
 
7
6
  def entry
8
7
  parser = Kamigo::EventParsers::LineEventParser.new
9
8
  events = parser.parse_events(request)
10
9
  events.each do |event|
11
- process_event(event)
10
+ output = process_event(event) || Kamigo.line_default_message
11
+ responser = Kamigo::EventResponsers::LineEventResponser.new
12
+ response = responser.response_event(event, output)
12
13
  end
13
14
  head :ok
14
15
  end
@@ -16,68 +17,12 @@ class LineController < ApplicationController
16
17
  private
17
18
 
18
19
  def process_event(event)
19
- http_method, path, request_params = slot_filling(event)
20
- http_method, path, request_params = language_understanding(event.message) if http_method.nil?
21
- encoded_path = URI.encode(path)
22
- request_params = event.platform_params.merge(request_params)
23
- output = reserve_route(encoded_path, http_method: http_method, request_params: request_params, format: :line)
24
- responser = Kamigo::EventResponsers::LineEventResponser.new
25
- response = responser.response_event(event, output)
26
- puts response&.body
27
- rescue NoMethodError => e
28
- puts e.full_message
29
- responser = Kamigo::EventResponsers::LineEventResponser.new
30
- response = responser.response_event(event, {
31
- type: "text",
32
- text: "404 not found"
33
- })
34
- end
35
-
36
- def slot_filling(event)
37
- begin
38
- Kamiform
39
- rescue StandardError
40
- return [nil, nil, nil]
41
- end
42
-
43
- form = Kamiform.find_by(
44
- platform_type: event.platform_type,
45
- source_group_id: event.source_group_id
46
- )
47
- return [nil, nil, nil] if form.nil?
48
-
49
- http_method = form.http_method
50
- path = form.path
51
- request_params = form.params
52
-
53
- # fill
54
- if form.field['.'].nil?
55
- request_params[form.field] = event.message
56
- else
57
- *head, tail = form.field.split('.')
58
- request_params.dig(*head)[tail] = event.message
20
+ Kamigo.line_event_processors.each do |processor|
21
+ processor.request = request
22
+ processor.form_authenticity_token = form_authenticity_token
23
+ output = processor.process(event)
24
+ return output if output.present?
59
25
  end
60
- form.destroy
61
- [http_method.upcase, path, request_params]
26
+ nil
62
27
  end
63
-
64
- def language_understanding(text)
65
- http_method = %w[GET POST PUT PATCH DELETE].find do |http_method|
66
- text.start_with? http_method
67
- end
68
- text = text[http_method.size..-1] if http_method.present?
69
- text = text.strip
70
- lines = text.split("\n").compact
71
- path = lines.shift
72
- request_params = parse_json(lines.join(""))
73
- request_params[:authenticity_token] = form_authenticity_token
74
- http_method = request_params["_method"]&.upcase || http_method || "GET"
75
- [http_method, path, request_params]
76
- end
77
-
78
- def parse_json(string)
79
- return {} if string.strip.empty?
80
- JSON.parse(string)
81
- end
82
-
83
28
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/base'
4
+
5
+ module Kamigo
6
+ module Generators
7
+ class InstallGenerator < Rails::Generators::Base
8
+ source_root File.expand_path("../../templates", __FILE__)
9
+
10
+ desc "Creates a Kamigo initializer and copy locale files to your application."
11
+
12
+ def copy_initializer
13
+ template "kamigo.rb", "config/initializers/kamigo.rb"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ Kamigo.setup do |config|
2
+ # When user input doesn't match the route, Kamigo will pass the reuqest to default_path with default_http_method.
3
+ # config.default_path = "/"
4
+ # config.default_http_method = "GET"
5
+
6
+ # When Kamigo don't know what message to reply, then Kamigo reply the line_default_message.
7
+ # config.line_default_message = {
8
+ # type: "text",
9
+ # text: "Sorry, I don't understand your message."
10
+ # }
11
+
12
+ # When line_default_message is nil, then Kamigo don't reply message.
13
+ # config.line_default_message = nil
14
+ end
data/lib/kamigo.rb CHANGED
@@ -7,6 +7,24 @@ require "kamigo/events/basic_event"
7
7
  require "kamigo/events/line_event"
8
8
  require "kamigo/event_parsers/line_event_parser"
9
9
  require "kamigo/event_responsers/line_event_responser"
10
+ require "kamigo/event_processors/rails_router_processor"
10
11
  module Kamigo
11
- # Your code goes here...
12
+ mattr_accessor :line_default_message
13
+ @@line_default_message = {
14
+ type: "text",
15
+ text: "Sorry, I don't understand your message."
16
+ }
17
+
18
+ mattr_accessor :default_path
19
+ @@default_path = nil
20
+
21
+ mattr_accessor :default_http_method
22
+ @@default_http_method = "GET"
23
+
24
+ mattr_accessor :line_event_processors
25
+ @@line_event_processors = [EventProcessors::RailsRouterProcessor.new]
26
+
27
+ def self.setup
28
+ yield self
29
+ end
12
30
  end
@@ -13,9 +13,11 @@ module Kamigo
13
13
 
14
14
  def parse(event)
15
15
  payload = JSON.parse(event.to_json, symbolize_names: true)[:src]
16
+ response = client.get_profile(payload[:source][:userId])
16
17
  line_event = Kamigo::Events::LineEvent.new
17
18
  line_event.payload = payload
18
19
  line_event.reply_token = event['replyToken']
20
+ line_event.profile = JSON.parse(response.body)
19
21
  line_event.source_type = payload.dig(:source, :type)
20
22
  line_event.source_group_id = payload.dig(:source, :groupId) || payload.dig(:source, :roomId) || payload.dig(:source, :userId)
21
23
  line_event.source_user_id = payload.dig(:source, :userId) || payload.dig(:source, :groupId) || payload.dig(:source, :roomId)
@@ -0,0 +1,87 @@
1
+ module Kamigo
2
+ module EventProcessors
3
+ class RailsRouterProcessor
4
+ attr_accessor :request
5
+ attr_accessor :form_authenticity_token
6
+
7
+ def initialize
8
+ end
9
+
10
+ def process(event)
11
+ http_method, path, request_params = kamiform_context(event)
12
+ http_method, path, request_params = language_understanding(event.message) if http_method.nil?
13
+ encoded_path = URI.encode(path)
14
+ request_params = event.platform_params.merge(request_params)
15
+ output = reserve_route(encoded_path, http_method: http_method, request_params: request_params, format: :line)
16
+ return output if output.present?
17
+
18
+ return nil if Kamigo.default_path.nil?
19
+ reserve_route(URI.encode(Kamigo.default_path), http_method: Kamigo.default_http_method, request_params: request_params, format: :line)
20
+ end
21
+
22
+ private
23
+
24
+ def kamiform_context(event)
25
+ begin
26
+ Kamiform
27
+ rescue StandardError
28
+ return [nil, nil, nil]
29
+ end
30
+
31
+ form = Kamiform.find_by(
32
+ platform_type: event.platform_type,
33
+ source_group_id: event.source_group_id
34
+ )
35
+ return [nil, nil, nil] if form.nil?
36
+
37
+ http_method = form.http_method
38
+ path = form.path
39
+ request_params = form.params
40
+
41
+ # fill
42
+ if form.field['.'].nil?
43
+ request_params[form.field] = event.message
44
+ else
45
+ *head, tail = form.field.split('.')
46
+ request_params.dig(*head)[tail] = event.message
47
+ end
48
+ form.destroy
49
+ [http_method.upcase, path, request_params]
50
+ end
51
+
52
+ def language_understanding(text)
53
+ http_method = %w[GET POST PUT PATCH DELETE].find do |http_method|
54
+ text.start_with? http_method
55
+ end
56
+ text = text[http_method.size..-1] if http_method.present?
57
+ text = text.strip
58
+ lines = text.split("\n").compact
59
+ path = lines.shift
60
+ request_params = parse_json(lines.join(""))
61
+ request_params[:authenticity_token] = @form_authenticity_token
62
+ http_method = request_params["_method"]&.upcase || http_method || "GET"
63
+ [http_method, path, request_params]
64
+ end
65
+
66
+ def parse_json(string)
67
+ return {} if string.strip.empty?
68
+ JSON.parse(string)
69
+ end
70
+
71
+ def reserve_route(path, http_method: "GET", request_params: nil, format: nil)
72
+ path = "/#{path}" unless path.start_with? "/"
73
+
74
+ @request.request_method = http_method
75
+ @request.path_info = path
76
+ @request.format = format if format.present?
77
+ @request.request_parameters = request_params if request_params.present?
78
+
79
+ # req = Rack::Request.new
80
+ # env = {Rack::RACK_INPUT => StringIO.new}
81
+
82
+ res = Rails.application.routes.router.serve(@request)
83
+ res[2].body if res[2].respond_to?(:body)
84
+ end
85
+ end
86
+ end
87
+ end
@@ -5,7 +5,7 @@ module Kamigo
5
5
 
6
6
  def response_event(event, message)
7
7
  return nil if message.blank?
8
- message = JSON.parse(message) if message.is_a?(String) && message.start_with?("{")
8
+ message = JSON.parse(message) if message.is_a?(String) && (message.start_with?("{") || message.start_with?("["))
9
9
  return nil if message.blank?
10
10
  response = client.reply_message(event.reply_token, message)
11
11
  response
@@ -7,6 +7,7 @@ module Kamigo
7
7
  attr_accessor :source_type
8
8
  attr_accessor :source_group_id
9
9
  attr_accessor :source_user_id
10
+ attr_accessor :profile
10
11
  attr_accessor :payload
11
12
 
12
13
  def platform_params
@@ -14,7 +15,8 @@ module Kamigo
14
15
  platform_type: platform_type,
15
16
  source_type: source_type,
16
17
  source_group_id: source_group_id,
17
- source_user_id: source_user_id
18
+ source_user_id: source_user_id,
19
+ profile: profile
18
20
  }
19
21
  end
20
22
  end
@@ -1,3 +1,3 @@
1
1
  module Kamigo
2
- VERSION = '0.14.0'.freeze
2
+ VERSION = '0.19.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kamigo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - etrex
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-25 00:00:00.000000000 Z
11
+ date: 2021-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -30,20 +30,20 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.21'
33
+ version: '0.25'
34
34
  - - ">="
35
35
  - !ruby/object:Gem::Version
36
- version: 0.21.0
36
+ version: 0.25.0
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: '0.21'
43
+ version: '0.25'
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 0.21.0
46
+ version: 0.25.0
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: kamiflex
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -103,10 +103,10 @@ files:
103
103
  - README.md
104
104
  - Rakefile
105
105
  - app/assets/config/kamigo_manifest.js
106
- - app/controllers/concerns/reverse_route.rb
107
106
  - app/controllers/kamigo_controller.rb
108
107
  - app/controllers/line_controller.rb
109
108
  - config/routes.rb
109
+ - lib/generators/kamigo/install_generator.rb
110
110
  - lib/generators/rails/kamigo/USAGE
111
111
  - lib/generators/rails/kamigo/kamigo_generator.rb
112
112
  - lib/generators/rails/kamigo/templates/edit.liff.erb
@@ -115,10 +115,12 @@ files:
115
115
  - lib/generators/rails/kamigo/templates/show.line.erb
116
116
  - lib/generators/rails/scaffold_controller_generator.rb
117
117
  - lib/generators/rails/templates/controller.rb
118
+ - lib/generators/templates/kamigo.rb
118
119
  - lib/kamigo.rb
119
120
  - lib/kamigo/clients/line_client.rb
120
121
  - lib/kamigo/engine.rb
121
122
  - lib/kamigo/event_parsers/line_event_parser.rb
123
+ - lib/kamigo/event_processors/rails_router_processor.rb
122
124
  - lib/kamigo/event_responsers/line_event_responser.rb
123
125
  - lib/kamigo/events/basic_event.rb
124
126
  - lib/kamigo/events/line_event.rb
@@ -1,16 +0,0 @@
1
- module ReverseRoute
2
- def reserve_route(path, http_method: "GET", request_params: nil, format: nil)
3
- path = "/#{path}" unless path.start_with? "/"
4
-
5
- request.request_method = http_method
6
- request.path_info = path
7
- request.format = format if format.present?
8
- request.request_parameters = request_params if request_params.present?
9
-
10
- # req = Rack::Request.new
11
- # env = {Rack::RACK_INPUT => StringIO.new}
12
-
13
- res = Rails.application.routes.router.serve(request)
14
- res[2].body
15
- end
16
- end