rodbot 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +9 -0
- data/README.md +3 -3
- data/checksums/rodbot-0.3.2.gem.sha512 +1 -0
- data/lib/rodbot/generator.rb +3 -2
- data/lib/rodbot/plugins/matrix/relay.rb +1 -3
- data/lib/rodbot/plugins/slack/relay.rb +20 -5
- data/lib/rodbot/plugins/word_of_the_day/schedule.rb +5 -5
- data/lib/rodbot/rack.rb +5 -6
- data/lib/rodbot/relay.rb +18 -5
- data/lib/rodbot/simulator.rb +3 -12
- data/lib/rodbot/version.rb +1 -1
- data/lib/templates/deploy/docker/compose.yaml.gerb +1 -1
- data/lib/templates/deploy/docker-split/compose.yaml.gerb +1 -1
- data/lib/templates/deploy/render/render-build.sh +10 -0
- data/lib/templates/deploy/render/render-start.sh +5 -0
- data/lib/templates/deploy/render/render.yaml.gerb +19 -0
- data/lib/templates/deploy/render-split/render-build.sh +10 -0
- data/lib/templates/deploy/render-split/render-start.sh +18 -0
- data/lib/templates/deploy/render-split/render.yaml.gerb +42 -0
- data/lib/templates/new/.ruby-version.gerb +1 -0
- data/lib/templates/new/app/app.rb +1 -0
- data/lib/templates/new/app/routes/healthz.rb +15 -0
- data/rodbot.gemspec +1 -1
- data.tar.gz.sig +0 -0
- metadata +13 -7
- metadata.gz.sig +0 -0
- data/lib/templates/new/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bf9f1ee8fd09d93797a5ba276aa6fec09be9620e540f118240525c73a6fda6b
|
4
|
+
data.tar.gz: b36fdd850e38596aaf7da805107d0cbbbcb46de823e76cad151676fbcc14dd9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37a9346640167dc0543d9361b1d53789e363d27e6c57129fde777897f7e8ec3fff51e735129accdfaf8caee943a29fa19daae2ea5acdab6023d11d7dbf4ebaaa
|
7
|
+
data.tar.gz: 6fec833877807a7b6dc85e19682c5bf88172ad2ff32ce0d0c5e83565cecbf60e54517f1aaeda451e17ee610f5338969bd05ffe5a8c002b649c28c3e35f25949b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -302,13 +302,13 @@ overmind start
|
|
302
302
|
|
303
303
|
## Request
|
304
304
|
|
305
|
-
To query the **app service**, you can either use the bundled [
|
305
|
+
To query the **app service**, you can either use the bundled [HTTPX](https://rubygems.org/gems/httpx) gem or the following convenience wrapper:
|
306
306
|
|
307
307
|
```ruby
|
308
|
-
response = Rodbot.request('/time',
|
308
|
+
response = Rodbot.request('/time', params: { zone: 'UTC' })
|
309
309
|
```
|
310
310
|
|
311
|
-
This uses the default `method: :get` and the default `timeout: 10` seconds, it returns an instance of [
|
311
|
+
This uses the default `method: :get` and the default `timeout: 10` seconds, it returns an instance of [HTTPX::Response](https://www.rubydoc.info/gems/httpx/HTTPX/Response):
|
312
312
|
|
313
313
|
```ruby
|
314
314
|
response.code # => 200
|
@@ -0,0 +1 @@
|
|
1
|
+
3704bffdb0e27a9544bbdc7538051a9253eeefe81bbbfeea14e1f486e36c701ae200a1b6da151306a96d8e8ccb154236cf18ce4cb27821cd42cbc165a6bc79e6
|
data/lib/rodbot/generator.rb
CHANGED
@@ -22,7 +22,7 @@ module Rodbot
|
|
22
22
|
class Generator
|
23
23
|
|
24
24
|
# Glob to filter relevant template files
|
25
|
-
GLOB = "**/{*,.ruby-version
|
25
|
+
GLOB = "**/{*,.ruby-version*,.gitignore,.keep}"
|
26
26
|
|
27
27
|
# Colors used by +info+ to color part of the output
|
28
28
|
TAG_COLORS = {
|
@@ -38,8 +38,9 @@ module Rodbot
|
|
38
38
|
|
39
39
|
# Print the interpolated template to STDOUT
|
40
40
|
def display
|
41
|
+
puts
|
41
42
|
each_template_path do |template_path, target_path, content|
|
42
|
-
puts "
|
43
|
+
puts "### #{target_path} ###", (content || template_path.read), nil
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
@@ -71,9 +71,7 @@ module Rodbot
|
|
71
71
|
|
72
72
|
def on_message(message)
|
73
73
|
if message.content[:msgtype] == 'm.text' && message.content[:body].start_with?('!')
|
74
|
-
|
75
|
-
html ||= reply_to(message)
|
76
|
-
room.send_html(html)
|
74
|
+
room.send_html(reply_to(message))
|
77
75
|
end
|
78
76
|
end
|
79
77
|
|
@@ -42,7 +42,11 @@ module Rodbot
|
|
42
42
|
body = remote.gets("\x04")
|
43
43
|
remote.close
|
44
44
|
body.force_encoding('UTF-8')
|
45
|
-
client.web_client.chat_postMessage(
|
45
|
+
client.web_client.chat_postMessage(
|
46
|
+
channel: channel_id,
|
47
|
+
text: md_to_slack_text(body),
|
48
|
+
as_user: true
|
49
|
+
)
|
46
50
|
end
|
47
51
|
end
|
48
52
|
end
|
@@ -56,23 +60,34 @@ module Rodbot
|
|
56
60
|
|
57
61
|
def on_message(message)
|
58
62
|
if message.text.start_with?('!')
|
59
|
-
|
60
|
-
|
61
|
-
|
63
|
+
client.web_client.chat_postMessage(
|
64
|
+
channel: message.channel,
|
65
|
+
text: reply_to(message),
|
66
|
+
as_user: true
|
67
|
+
)
|
62
68
|
end
|
63
69
|
end
|
64
70
|
|
65
71
|
def reply_to(message)
|
66
72
|
command(*message.text[1..].split(/\s+/, 2)).
|
67
|
-
psub(placeholders(message.user))
|
73
|
+
psub(placeholders(message.user)).
|
74
|
+
then { md_to_slack_text(_1) }
|
68
75
|
end
|
69
76
|
|
77
|
+
# @see https://api.slack.com/reference/surfaces/formatting
|
70
78
|
def placeholders(sender)
|
71
79
|
{
|
72
80
|
sender: "<@#{sender}>"
|
73
81
|
}
|
74
82
|
end
|
75
83
|
|
84
|
+
# @see https://api.slack.com/reference/surfaces/formatting
|
85
|
+
def md_to_slack_text(md)
|
86
|
+
md.
|
87
|
+
gsub(/\[(.+?)\]\((.+?)\)/, '<\2|\1>'). # convert links
|
88
|
+
gsub(/^\s*[*-]\s+/, '• ') # convert bullet lists
|
89
|
+
end
|
90
|
+
|
76
91
|
end
|
77
92
|
end
|
78
93
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'httpx'
|
4
4
|
|
5
5
|
module Rodbot
|
6
6
|
class Plugins
|
@@ -24,11 +24,11 @@ module Rodbot
|
|
24
24
|
|
25
25
|
class Today
|
26
26
|
def initialize
|
27
|
-
@response =
|
27
|
+
@response = HTTPX.with(timeout: { request_timeout: 60 }).get('https://www.merriam-webster.com/word-of-the-day')
|
28
28
|
end
|
29
29
|
|
30
30
|
def message
|
31
|
-
if @response.
|
31
|
+
if @response.status == 200
|
32
32
|
"Word of the day: [#{word}](#{url})"
|
33
33
|
else
|
34
34
|
"Sorry, there was a problem fetching the word of the day."
|
@@ -38,11 +38,11 @@ module Rodbot
|
|
38
38
|
private
|
39
39
|
|
40
40
|
def word
|
41
|
-
@response.body.match(/<h2 class="word-header-txt">(.+?)</).captures.first
|
41
|
+
@response.body.to_s.match(/<h2 class="word-header-txt">(.+?)</).captures.first
|
42
42
|
end
|
43
43
|
|
44
44
|
def url
|
45
|
-
@response.body.match(/<meta property="og:url" content="(.+?)"/).captures.first
|
45
|
+
@response.body.to_s.match(/<meta property="og:url" content="(.+?)"/).captures.first
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
data/lib/rodbot/rack.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'httpx'
|
4
4
|
|
5
5
|
using Rodbot::Refinements
|
6
6
|
|
@@ -36,12 +36,11 @@ module Rodbot
|
|
36
36
|
# Send request to the app service
|
37
37
|
#
|
38
38
|
# @param path [String] path e.g. +/help+
|
39
|
-
# @param
|
40
|
-
# @param method [Symbol, String] HTTP method
|
39
|
+
# @param params [Hash] params hash e.g. +{ search: 'foobar' }+
|
41
40
|
# @param timeout [Integer] max seconds to wait for response
|
42
|
-
# @return [
|
43
|
-
def request(path,
|
44
|
-
|
41
|
+
# @return [HTTPX::Response]
|
42
|
+
def request(path, params: {}, timeout: 10)
|
43
|
+
HTTPX.with(timeout: { request_timeout: timeout }).get(Rodbot::Services::App.url.uri_concat(path), params: params)
|
45
44
|
end
|
46
45
|
|
47
46
|
end
|
data/lib/rodbot/relay.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'digest'
|
4
4
|
require 'socket'
|
5
|
-
require '
|
5
|
+
require 'httpx'
|
6
6
|
|
7
7
|
module Rodbot
|
8
8
|
|
@@ -84,15 +84,28 @@ module Rodbot
|
|
84
84
|
]
|
85
85
|
end
|
86
86
|
|
87
|
-
# Perform the command
|
87
|
+
# Perform the built-in command or fall back to the app using +request+
|
88
88
|
#
|
89
89
|
# @param command [String] command to perform
|
90
90
|
# @param argument [String, nil] optional arguments
|
91
91
|
# @return [String] response as Markdown
|
92
92
|
def command(command, argument=nil)
|
93
|
-
|
94
|
-
|
95
|
-
when
|
93
|
+
case command
|
94
|
+
when 'ping' then 'pong'
|
95
|
+
when 'version' then "rodbot-#{Rodbot::VERSION}"
|
96
|
+
else request(command, argument)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Perform the command on the app using a GET request
|
101
|
+
#
|
102
|
+
# @param command [String] command to perform
|
103
|
+
# @param argument [String, nil] optional arguments
|
104
|
+
# @return [String] response as Markdown
|
105
|
+
def request(command, argument=nil)
|
106
|
+
response = Rodbot.request(command, params: { argument: argument })
|
107
|
+
case response.status
|
108
|
+
when 200 then response.body.to_s
|
96
109
|
when 404 then "[[SENDER]] I don't know what do do with `!#{command}`. 🤔"
|
97
110
|
else fail
|
98
111
|
end
|
data/lib/rodbot/simulator.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
3
|
require 'readline'
|
4
|
-
require '
|
4
|
+
require 'httpx'
|
5
5
|
require 'pastel'
|
6
6
|
require 'tty-markdown'
|
7
7
|
|
@@ -16,6 +16,7 @@ module Rodbot
|
|
16
16
|
# @param raw [Boolean] whether to display raw Markdown
|
17
17
|
def initialize(sender, raw: false)
|
18
18
|
@sender, @raw = sender, raw
|
19
|
+
@relay = Rodbot::Relay.new
|
19
20
|
@pastel = Pastel.new
|
20
21
|
end
|
21
22
|
|
@@ -33,17 +34,7 @@ module Rodbot
|
|
33
34
|
def reply_to(message)
|
34
35
|
return "(no command given)" unless message.match?(/^!/)
|
35
36
|
command, argument = message[1..].split(/\s+/, 2)
|
36
|
-
|
37
|
-
response = Rodbot.request(command, query: { argument: argument })
|
38
|
-
case response.code
|
39
|
-
when 200 then response.body
|
40
|
-
when 404 then "[[SENDER]] I've never heard of `!#{command}`, try `!help` instead. 🤔"
|
41
|
-
else fail
|
42
|
-
end
|
43
|
-
rescue
|
44
|
-
"[[SENDER]] I'm having trouble talking to the app. 💣"
|
45
|
-
end
|
46
|
-
text_for body.psub(placeholders)
|
37
|
+
text_for @relay.send(:command, command, argument).psub(placeholders)
|
47
38
|
end
|
48
39
|
|
49
40
|
def placeholders
|
data/lib/rodbot/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
services:
|
2
|
+
- type: web
|
3
|
+
name: bot
|
4
|
+
domains:
|
5
|
+
- bot.example.com # TODO: use a domain name of your own
|
6
|
+
runtime: ruby
|
7
|
+
buildCommand: render-build.sh
|
8
|
+
startCommand: render-start.sh
|
9
|
+
healthCheckPath: /healthz
|
10
|
+
autoDeploy: true
|
11
|
+
envVars:
|
12
|
+
- key: PORT
|
13
|
+
value: 7200
|
14
|
+
- key: PRODUCTION_CREDENTIALS_KEY
|
15
|
+
value:
|
16
|
+
- key: RODBOT_ENV
|
17
|
+
value: production
|
18
|
+
- key: RODBOT_PLUGINS
|
19
|
+
value: matrix # TODO: update space separated list of plugins
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
case 1 in
|
4
|
+
"app")
|
5
|
+
export RODBOT_APP_HOST=0.0.0.0
|
6
|
+
bundle exec rodbot start app
|
7
|
+
;;
|
8
|
+
"relay")
|
9
|
+
bundle exec rodbot start relay
|
10
|
+
;;
|
11
|
+
"schedule")
|
12
|
+
bundle exec rodbot start schedule
|
13
|
+
;;
|
14
|
+
*)
|
15
|
+
echo "Invalid argument"
|
16
|
+
exit 1
|
17
|
+
;;
|
18
|
+
esac
|
@@ -0,0 +1,42 @@
|
|
1
|
+
services:
|
2
|
+
- type: web
|
3
|
+
name: bot-app
|
4
|
+
domains:
|
5
|
+
- bot.example.com # TODO: use a domain name of your own
|
6
|
+
runtime: ruby
|
7
|
+
buildCommand: render-build.sh
|
8
|
+
startCommand: render-start.sh app
|
9
|
+
healthCheckPath: /healthz
|
10
|
+
autoDeploy: true
|
11
|
+
envVars:
|
12
|
+
- fromGroup: bot
|
13
|
+
- key: PORT
|
14
|
+
value: 7200
|
15
|
+
- type: worker
|
16
|
+
name: bot-relay
|
17
|
+
runtime: ruby
|
18
|
+
buildCommand: render-build.sh
|
19
|
+
startCommand: render-start.sh relay
|
20
|
+
autoDeploy: true
|
21
|
+
envVars:
|
22
|
+
- fromGroup: bot
|
23
|
+
- type: worker
|
24
|
+
name: bot-schedule
|
25
|
+
runtime: ruby
|
26
|
+
buildCommand: render-build.sh
|
27
|
+
startCommand: render-start.sh schedule
|
28
|
+
autoDeploy: true
|
29
|
+
envVars:
|
30
|
+
- fromGroup: bot
|
31
|
+
|
32
|
+
envVarGroups:
|
33
|
+
- name: bot
|
34
|
+
envVars:
|
35
|
+
- key: PRODUCTION_CREDENTIALS_KEY
|
36
|
+
value:
|
37
|
+
- key: RODBOT_ENV
|
38
|
+
value: production
|
39
|
+
- key: RODBOT_PLUGINS
|
40
|
+
value: "matrix" # TODO: update space separated list of plugins
|
41
|
+
- key: RODBOT_APP_URL
|
42
|
+
value: https://bot.example.com # TODO: use the above service domain name
|
@@ -0,0 +1 @@
|
|
1
|
+
[%= RUBY_VERSION.sub(/\.\d+$/, '') %]
|
data/rodbot.gemspec
CHANGED
@@ -46,7 +46,7 @@ Gem::Specification.new do |spec|
|
|
46
46
|
spec.add_runtime_dependency 'dry-credentials', '~> 0'
|
47
47
|
spec.add_runtime_dependency 'tty-markdown', '~> 0'
|
48
48
|
spec.add_runtime_dependency 'pastel', '~> 0'
|
49
|
-
spec.add_runtime_dependency '
|
49
|
+
spec.add_runtime_dependency 'httpx', '~> 1'
|
50
50
|
spec.add_runtime_dependency 'puma', '~> 6', '>= 6.2'
|
51
51
|
spec.add_runtime_dependency 'roda', '~> 3'
|
52
52
|
spec.add_runtime_dependency 'tilt', '~> 2'
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rodbot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sven Schwyn
|
@@ -29,7 +29,7 @@ cert_chain:
|
|
29
29
|
kAyiRqgxF4dJviwtqI7mZIomWL63+kXLgjOjMe1SHxfIPo/0ji6+r1p4KYa7o41v
|
30
30
|
fwIwU1MKlFBdsjkd
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date: 2023-10-
|
32
|
+
date: 2023-10-18 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: zeitwerk
|
@@ -102,19 +102,19 @@ dependencies:
|
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
- !ruby/object:Gem::Dependency
|
105
|
-
name:
|
105
|
+
name: httpx
|
106
106
|
requirement: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '1'
|
111
111
|
type: :runtime
|
112
112
|
prerelease: false
|
113
113
|
version_requirements: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
117
|
+
version: '1'
|
118
118
|
- !ruby/object:Gem::Dependency
|
119
119
|
name: puma
|
120
120
|
requirement: !ruby/object:Gem::Requirement
|
@@ -451,6 +451,7 @@ files:
|
|
451
451
|
- checksums/rodbot-0.2.0.gem.sha512
|
452
452
|
- checksums/rodbot-0.3.0.gem.sha512
|
453
453
|
- checksums/rodbot-0.3.1.gem.sha512
|
454
|
+
- checksums/rodbot-0.3.2.gem.sha512
|
454
455
|
- doc/rodbot.afphoto
|
455
456
|
- doc/rodbot.avif
|
456
457
|
- exe/rodbot
|
@@ -509,12 +510,17 @@ files:
|
|
509
510
|
- lib/templates/deploy/docker/compose.yaml.gerb
|
510
511
|
- lib/templates/deploy/procfile-split/Procfile.gerb
|
511
512
|
- lib/templates/deploy/procfile/Procfile.gerb
|
513
|
+
- lib/templates/deploy/render-split/render-build.sh
|
514
|
+
- lib/templates/deploy/render-split/render-start.sh
|
512
515
|
- lib/templates/deploy/render-split/render.yaml.gerb
|
516
|
+
- lib/templates/deploy/render/render-build.sh
|
517
|
+
- lib/templates/deploy/render/render-start.sh
|
513
518
|
- lib/templates/deploy/render/render.yaml.gerb
|
514
519
|
- lib/templates/new/.gitignore
|
515
|
-
- lib/templates/new/.ruby-version
|
520
|
+
- lib/templates/new/.ruby-version.gerb
|
516
521
|
- lib/templates/new/README.md
|
517
522
|
- lib/templates/new/app/app.rb
|
523
|
+
- lib/templates/new/app/routes/healthz.rb
|
518
524
|
- lib/templates/new/app/routes/help.rb
|
519
525
|
- lib/templates/new/app/views/layout.erb
|
520
526
|
- lib/templates/new/app/views/root.erb
|
@@ -563,7 +569,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
563
569
|
- !ruby/object:Gem::Version
|
564
570
|
version: '0'
|
565
571
|
requirements: []
|
566
|
-
rubygems_version: 3.4.
|
572
|
+
rubygems_version: 3.4.21
|
567
573
|
signing_key:
|
568
574
|
specification_version: 4
|
569
575
|
summary: Minimalistic framework to build chat bots on top of a Roda backend
|
metadata.gz.sig
CHANGED
Binary file
|
@@ -1 +0,0 @@
|
|
1
|
-
3.2
|