kamigo 0.14.0 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
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