kamigo 0.15.0 → 0.20.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: fafd4faec131e7521901c951025fff9e4aad7f6612ad53c0e84e0376b4b29138
4
- data.tar.gz: a3488e005a42c3f635d1ec09b0ec648dbbdcc60b7846f55f14da5d7ef716ae9f
3
+ metadata.gz: 7378b8ac81d656a0279ae87d084410ff9ac89944054ad6f26a2571e94a3cf694
4
+ data.tar.gz: 3ca981698b7693e4ff20e3fd45bb38a47b60fa4b7fe20d57339997764609d286
5
5
  SHA512:
6
- metadata.gz: a42acfa7783e9081d34a556fe2017b1d6bf4391bba2377c3101fa1972aceb9f2714ccee174d40dd27fc58d9999d485bb0b0b182f0ce73f7424d03307a8b5f1c8
7
- data.tar.gz: 8b429eec098ada0cd1ad72e85b1034b51c58349a29dcf76bbc8e66dd904c51824d268e3bd76dcf63fad521a8ba52df6d511beaadbd8f47bd6f2dfeba388ad4a6
6
+ metadata.gz: 505d6d3f8d32b016d0dbd72b3d35af48a065631a500d34575eff79fc1916f203395f6b7d60439ed9633b1c973ce840d1d02b9da7778c46719232ac8bf9e40ab4
7
+ data.tar.gz: 414c7828e10aea9c7c74a62b4c2dab36ab8e798c56f61bf2696c6ce51750e1e8083dd3d7d268ea38e855513f535a57a43a2ad4549cfc65d6a89d534cac4de4fc
data/README.md CHANGED
@@ -18,6 +18,8 @@ cd kamigo_demo
18
18
  # 安裝套件
19
19
  bundle add kamigo
20
20
  bundle add dotenv-rails
21
+ # 建立設定檔
22
+ rails g kamigo:install
21
23
  # 新增 resource controller
22
24
  rails g scaffold todo name desc
23
25
  rails db:create
@@ -147,9 +149,15 @@ Kamigo 預設使用基本的語意理解模型,會將使用者輸入視為在
147
149
 
148
150
  # 計畫
149
151
  - 提供多種語意理解模型串接
152
+ - DialogFlow
153
+ - LUIS
150
154
  - 網站使用者與聊天機器人使用者綁定
151
- - 支援 Telegram
152
- - 支援 Facebook Messenger
155
+ - Devise
156
+ - Log / 錯誤追蹤
157
+ - 支援其他平台
158
+ - Telegram
159
+ - Facebook Messenger
160
+ - Slack
153
161
 
154
162
  ## License
155
163
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -1,83 +1,11 @@
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
- parser = Kamigo::EventParsers::LineEventParser.new
9
- events = parser.parse_events(request)
10
- events.each do |event|
11
- process_event(event)
12
- end
7
+ request_handler = Kamigo::RequestHandlers::LineRequestHandler.new(request, form_authenticity_token)
8
+ request_handler.handle
13
9
  head :ok
14
10
  end
15
-
16
- private
17
-
18
- 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
59
- end
60
- form.destroy
61
- [http_method.upcase, path, request_params]
62
- 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
11
  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,26 @@ 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"
11
+ require "kamigo/request_handlers/line_request_handler"
12
+
10
13
  module Kamigo
11
- # Your code goes here...
14
+ mattr_accessor :line_default_message
15
+ @@line_default_message = {
16
+ type: "text",
17
+ text: "Sorry, I don't understand your message."
18
+ }
19
+
20
+ mattr_accessor :default_path
21
+ @@default_path = nil
22
+
23
+ mattr_accessor :default_http_method
24
+ @@default_http_method = "GET"
25
+
26
+ mattr_accessor :line_event_processors
27
+ @@line_event_processors = [EventProcessors::RailsRouterProcessor.new]
28
+
29
+ def self.setup
30
+ yield self
31
+ end
12
32
  end
@@ -12,7 +12,8 @@ module Kamigo
12
12
  end
13
13
 
14
14
  def parse(event)
15
- payload = JSON.parse(event.to_json, symbolize_names: true)[:src]
15
+ event_hash = JSON.parse(event.to_json, symbolize_names: true)
16
+ payload = event_hash[:src] || event_hash
16
17
  response = client.get_profile(payload[:source][:userId])
17
18
  line_event = Kamigo::Events::LineEvent.new
18
19
  line_event.payload = payload
@@ -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
@@ -0,0 +1,32 @@
1
+ module Kamigo
2
+ module RequestHandlers
3
+ class LineRequestHandler
4
+ def initialize(request, form_authenticity_token)
5
+ @request = request
6
+ @form_authenticity_token = form_authenticity_token
7
+ end
8
+
9
+ def handle
10
+ parser = EventParsers::LineEventParser.new
11
+ events = parser.parse_events(@request)
12
+ events.each do |event|
13
+ output = process_event(event) || Kamigo.line_default_message
14
+ responser = EventResponsers::LineEventResponser.new
15
+ response = responser.response_event(event, output)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def process_event(event)
22
+ Kamigo.line_event_processors.each do |processor|
23
+ processor.request = @request
24
+ processor.form_authenticity_token = @form_authenticity_token
25
+ output = processor.process(event)
26
+ return output if output.present?
27
+ end
28
+ nil
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,3 +1,3 @@
1
1
  module Kamigo
2
- VERSION = '0.15.0'.freeze
2
+ VERSION = '0.20.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.15.0
4
+ version: 0.20.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-12-06 00:00:00.000000000 Z
11
+ date: 2021-04-03 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,14 +115,17 @@ 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
125
127
  - lib/kamigo/railtie.rb
128
+ - lib/kamigo/request_handlers/line_request_handler.rb
126
129
  - lib/kamigo/version.rb
127
130
  homepage: https://github.com/etrex/kamigo
128
131
  licenses:
@@ -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