beeline-rb 0.0.1
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 +7 -0
- data/.gitignore +58 -0
- data/Gemfile +3 -0
- data/LICENSE +41 -0
- data/README.md +93 -0
- data/Rakefile +39 -0
- data/beeline-rb.gemspec +38 -0
- data/example-config.yml +7 -0
- data/lib/beeline.rb +19 -0
- data/lib/beeline/bot.rb +43 -0
- data/lib/beeline/client.rb +196 -0
- data/lib/beeline/config.rb +35 -0
- data/lib/beeline/session.rb +230 -0
- data/lib/beeline/version.rb +4 -0
- data/support/320-logo-2020-10-08 14-08.png +0 -0
- data/support/logo-2020-10-08 14-08.png +0 -0
- data/support/logo-2020-10-08 14-08.xcf +0 -0
- metadata +399 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: eb82e60fd4d94693d41b751a344ce3ec7cbe88e2b8a9322f52ca7a987d0ca762
|
4
|
+
data.tar.gz: 5c3996593694fd9440f0f83ab248225c0b187cc5d86231ed975d218850107389
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4467d4566ea3e550c4b6406fe6f3e8a44d0b5f1379a0a59b25c2c2008a656cf49863086f875bd75ee185f8f48ec5362946c39e3f64e4700433ee30d24c96aace
|
7
|
+
data.tar.gz: 94bc32b5c17add1a54073a622818b705210beca53b9ce94aaf93957f852e5e60af0b164426dfa90bc064c7028afc545846f4e45f14f0109fe3e989b02d5c79c5
|
data/.gitignore
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/spec/examples.txt
|
9
|
+
/test/tmp/
|
10
|
+
/test/version_tmp/
|
11
|
+
/tmp/
|
12
|
+
|
13
|
+
# Used by dotenv library to load environment variables.
|
14
|
+
# .env
|
15
|
+
|
16
|
+
# Ignore Byebug command history file.
|
17
|
+
.byebug_history
|
18
|
+
|
19
|
+
## Specific to RubyMotion:
|
20
|
+
.dat*
|
21
|
+
.repl_history
|
22
|
+
build/
|
23
|
+
*.bridgesupport
|
24
|
+
build-iPhoneOS/
|
25
|
+
build-iPhoneSimulator/
|
26
|
+
|
27
|
+
## Specific to RubyMotion (use of CocoaPods):
|
28
|
+
#
|
29
|
+
# We recommend against adding the Pods directory to your .gitignore. However
|
30
|
+
# you should judge for yourself, the pros and cons are mentioned at:
|
31
|
+
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
32
|
+
#
|
33
|
+
# vendor/Pods/
|
34
|
+
|
35
|
+
## Documentation cache and generated files:
|
36
|
+
/.yardoc/
|
37
|
+
/_yardoc/
|
38
|
+
/doc/
|
39
|
+
/rdoc/
|
40
|
+
|
41
|
+
## Environment normalization:
|
42
|
+
/.bundle/
|
43
|
+
/vendor/bundle
|
44
|
+
/lib/bundler/man/
|
45
|
+
|
46
|
+
# for a library or gem, you might want to ignore these files since the code is
|
47
|
+
# intended to run in multiple environments; otherwise, check them in:
|
48
|
+
# Gemfile.lock
|
49
|
+
# .ruby-version
|
50
|
+
# .ruby-gemset
|
51
|
+
|
52
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
53
|
+
.rvmrc
|
54
|
+
|
55
|
+
# Used by RuboCop. Remote config files pulled in from inherit_from directive.
|
56
|
+
# .rubocop-https?--*
|
57
|
+
config.yml
|
58
|
+
Gemfile.lock
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
CC0 1.0 Universal (CC0 1.0)
|
2
|
+
Public Domain Dedication
|
3
|
+
https://creativecommons.org/publicdomain/zero/1.0/
|
4
|
+
|
5
|
+
This is a human-readable summary of the Legal Code:
|
6
|
+
https://creativecommons.org/publicdomain/zero/1.0/legalcode
|
7
|
+
|
8
|
+
Disclaimer
|
9
|
+
|
10
|
+
The Commons Deed is not a legal instrument. It is simply a handy reference for
|
11
|
+
understanding the CC0 Legal Code, a human-readable expression of some of its key
|
12
|
+
terms. Think of it as the user-friendly interface to the CC0 Legal Code beneath.
|
13
|
+
This Deed itself has no legal value, and its contents do not appear in CC0.
|
14
|
+
Creative Commons is not a law firm and does not provide legal services.
|
15
|
+
Distributing, displaying, or linking to this Commons Deed does not create an
|
16
|
+
attorney-client relationship.
|
17
|
+
|
18
|
+
Creative Commons has not verified the copyright status of any work to which CC0
|
19
|
+
has been applied. CC makes no warranties about any work or its copyright status
|
20
|
+
in any jurisdiction, and disclaims all liability for all uses of any work.
|
21
|
+
|
22
|
+
No Copyright
|
23
|
+
|
24
|
+
The person who associated a work with this deed has dedicated the work to the
|
25
|
+
public domain by waiving all of his or her rights to the work worldwide under
|
26
|
+
copyright law, including all related and neighboring rights, to the extent
|
27
|
+
allowed by law.
|
28
|
+
|
29
|
+
You can copy, modify, distribute and perform the work, even for commercial
|
30
|
+
purposes, all without asking permission. See Other Information below.
|
31
|
+
|
32
|
+
Other Information
|
33
|
+
|
34
|
+
* In no way are the patent or trademark rights of any person affected by CC0,
|
35
|
+
nor are the rights that other persons may have in the work or in how the work
|
36
|
+
is used, such as publicity or privacy rights.
|
37
|
+
* Unless expressly stated otherwise, the person who associated a work with this
|
38
|
+
deed makes no warranties about the work, and disclaims liability for all uses
|
39
|
+
of the work, to the fullest extent permitted by applicable law.
|
40
|
+
* When using or citing the work, you should not imply endorsement by the author
|
41
|
+
or the affirmer.
|
data/README.md
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
beeline
|
2
|
+
=======
|
3
|
+
|
4
|
+
BeeLine is a BeeChat Client Framework for Ruby.
|
5
|
+
|
6
|
+
#### Installation
|
7
|
+
|
8
|
+
Add to your `Gemspec`
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'beeline-rb', require 'beeline'
|
12
|
+
```
|
13
|
+
|
14
|
+
```bash
|
15
|
+
bundle install
|
16
|
+
```
|
17
|
+
|
18
|
+
**--or--**
|
19
|
+
|
20
|
+
In your project ...
|
21
|
+
|
22
|
+
```bash
|
23
|
+
gem install beeline-rb
|
24
|
+
```
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
require 'beeline'
|
28
|
+
```
|
29
|
+
|
30
|
+
#### Usage
|
31
|
+
|
32
|
+
From the root of your project, add a file called `config.yml` containing (using your own account information):
|
33
|
+
|
34
|
+
```yaml
|
35
|
+
# Example config.yml
|
36
|
+
|
37
|
+
:chain:
|
38
|
+
:hive_account: social
|
39
|
+
:hive_public_key: STM5ctejUsoZ9FwfCaVbNvWYYgNMBo9TVsHSE8wHrqAmNJi6sDctt
|
40
|
+
:hive_posting_wif: 5JrvPrQeBBvCRdjv29iDvkwn3EQYZ9jqfAHzrCyUvfbEbRkrYFC
|
41
|
+
:hive_api_url: https://api.openhive.network
|
42
|
+
```
|
43
|
+
|
44
|
+
In your project, access the session:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
require 'beeline'
|
48
|
+
|
49
|
+
bot = Beeline::Bot.new(prefix: '$')
|
50
|
+
|
51
|
+
# Just match on a message.
|
52
|
+
bot.message('Ping!') do
|
53
|
+
'Pong!'
|
54
|
+
end
|
55
|
+
|
56
|
+
# Match on a pattern.
|
57
|
+
bot.message(/\d+/) do
|
58
|
+
'Yes, those are numbers.'
|
59
|
+
end
|
60
|
+
|
61
|
+
# Respond to `$time` with current time.
|
62
|
+
bot.command(:time) do
|
63
|
+
Time.now.to_s
|
64
|
+
end
|
65
|
+
|
66
|
+
# Respond to `$say` with reply.
|
67
|
+
bot.command(:say) do |args|
|
68
|
+
if args.nil?
|
69
|
+
'What do you want me to say?'
|
70
|
+
else
|
71
|
+
"You wanted me to say: #{args}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Start the bot run loop.
|
76
|
+
bot.run
|
77
|
+
```
|
78
|
+
|
79
|
+
---
|
80
|
+
|
81
|
+
<center>
|
82
|
+
<img src="https://i.imgur.com/h26ye3w.png" />
|
83
|
+
</center>
|
84
|
+
|
85
|
+
See some of my previous Ruby How To posts in: [#radiator](https://hive.blog/created/radiator) [#ruby](https://hive.blog/created/ruby)
|
86
|
+
|
87
|
+
## Get in touch!
|
88
|
+
|
89
|
+
If you're using Tender, I'd love to hear from you. Drop me a line and tell me what you think! I'm @inertia on Hive.
|
90
|
+
|
91
|
+
## License
|
92
|
+
|
93
|
+
I don't believe in intellectual "property". If you do, consider BeeLine as licensed under a Creative Commons [](http://creativecommons.org/publicdomain/zero/1.0/) License.
|
data/Rakefile
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'yard'
|
4
|
+
require 'beeline'
|
5
|
+
|
6
|
+
Encoding.default_external = Encoding::UTF_8
|
7
|
+
Encoding.default_internal = Encoding::UTF_8
|
8
|
+
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << 'test'
|
11
|
+
t.libs << 'lib'
|
12
|
+
t.test_files = FileList['test/**/*_test.rb']
|
13
|
+
t.ruby_opts << if ENV['HELL_ENABLED']
|
14
|
+
'-W2'
|
15
|
+
else
|
16
|
+
'-W1'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
task default: :test
|
21
|
+
|
22
|
+
task :console do
|
23
|
+
exec "irb -r beeline -I ./lib"
|
24
|
+
end
|
25
|
+
|
26
|
+
task :build do
|
27
|
+
exec 'gem build beeline-rb.gemspec'
|
28
|
+
end
|
29
|
+
|
30
|
+
task :push do
|
31
|
+
exec "gem push beeline-rb-#{Beeline::VERSION}.gem"
|
32
|
+
end
|
33
|
+
|
34
|
+
# We're not going to yank on a regular basis, but this is how it's done if you
|
35
|
+
# really want a task for that for some reason.
|
36
|
+
|
37
|
+
# task :yank do
|
38
|
+
# exec "gem yank beeline-rb -v #{Beeline::VERSION}"
|
39
|
+
# end
|
data/beeline-rb.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'beeline/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'beeline-rb'
|
8
|
+
spec.version = Beeline::VERSION
|
9
|
+
spec.authors = ['Anthony Martin']
|
10
|
+
spec.email = ['beeline@martin-studio.com']
|
11
|
+
|
12
|
+
spec.summary = %q{Bot Framework for BeeChat}
|
13
|
+
spec.description = %q{HIVE centric BeeChat bot Framework.}
|
14
|
+
spec.homepage = 'https://github.com/inertia186/beeline-rb'
|
15
|
+
spec.license = 'CC0 1.0'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test)/}) }
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.add_development_dependency 'bundler', '~> 2.0', '>= 2.0.1'
|
21
|
+
spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.1'
|
22
|
+
spec.add_development_dependency 'minitest', '~> 5.14', '= 5.14.2'
|
23
|
+
spec.add_development_dependency 'minitest-line', '~> 0.6', '= 0.6.5'
|
24
|
+
spec.add_development_dependency 'webmock', '~> 3.9', '= 3.9.1'
|
25
|
+
spec.add_development_dependency 'vcr', '~> 6.0', '= 6.0.0'
|
26
|
+
spec.add_development_dependency 'simplecov', '~> 0.19', '= 0.19.0'
|
27
|
+
spec.add_development_dependency 'yard', '~> 0.9', '= 0.9.25'
|
28
|
+
spec.add_development_dependency 'byebug', '~> 11.1', '= 11.1.3'
|
29
|
+
spec.add_development_dependency 'pry', '~> 0.13', '= 0.13.1'
|
30
|
+
spec.add_development_dependency 'pry-coolline', '~> 0.2', '= 0.2.5'
|
31
|
+
spec.add_development_dependency 'awesome_print', '~> 1.8', '= 1.8.0'
|
32
|
+
spec.add_development_dependency 'irb', '~> 1.2', '= 1.2.7'
|
33
|
+
spec.add_development_dependency 'rb-readline', '~> 0.5', '= 0.5.5'
|
34
|
+
|
35
|
+
spec.add_dependency 'hive-ruby', '~> 1.0', '= 1.0.0'
|
36
|
+
spec.add_dependency 'faye-websocket', '~> 0.11', '= 0.11.0'
|
37
|
+
spec.add_dependency 'permessage_deflate', '~> 0.1', '= 0.1.4'
|
38
|
+
end
|
data/example-config.yml
ADDED
data/lib/beeline.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'pry'
|
2
|
+
|
3
|
+
Bundler.require
|
4
|
+
|
5
|
+
defined? Thread.report_on_exception and Thread.report_on_exception = true
|
6
|
+
|
7
|
+
require 'beeline/config'
|
8
|
+
require 'beeline/client'
|
9
|
+
require 'beeline/session'
|
10
|
+
require 'beeline/bot'
|
11
|
+
|
12
|
+
module Beeline
|
13
|
+
PWD = Dir.pwd.freeze
|
14
|
+
BEE_BASE_URL = 'https://beechat.hive-engine.com/api'.freeze
|
15
|
+
BEE_WS_URL = 'wss://ws.beechat.hive-engine.com'.freeze
|
16
|
+
WS_KEEPALIVE_TIME = 30.freeze
|
17
|
+
|
18
|
+
extend self
|
19
|
+
end
|
data/lib/beeline/bot.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Beeline
|
2
|
+
class Bot < Client
|
3
|
+
attr_reader :prefix
|
4
|
+
|
5
|
+
def command name, options = {}, &block
|
6
|
+
commands[name] = {options: options, block: block}
|
7
|
+
end
|
8
|
+
|
9
|
+
def message pattern, options = {}, &block
|
10
|
+
messages[pattern] = {options: options, block: block}
|
11
|
+
end
|
12
|
+
|
13
|
+
def process_status(payload)
|
14
|
+
if payload['authenticated']
|
15
|
+
puts 'Got acknowledge authenticated.'
|
16
|
+
else
|
17
|
+
abort 'Unable to authenticate.'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def process_chat_message(payload)
|
22
|
+
from = payload['from']
|
23
|
+
content = payload['content'].to_s
|
24
|
+
command_key = content.split(' ').first.split(prefix).last.to_sym
|
25
|
+
reply = if commands.keys.include? command_key
|
26
|
+
args = (content.split(' ') - ["#{prefix}#{command_key}"]).join(' ')
|
27
|
+
args = args.empty? ? nil : args
|
28
|
+
|
29
|
+
commands[command_key][:block].call(args, from)
|
30
|
+
elsif (matching_messages = messages.select{|k| Regexp.new(k).match?(content)}).any?
|
31
|
+
message = matching_messages.values.first # match in order of declaration
|
32
|
+
|
33
|
+
message[:block].call(content, from)
|
34
|
+
end
|
35
|
+
|
36
|
+
if !!reply
|
37
|
+
conversation_id = payload['conversation_id']
|
38
|
+
|
39
|
+
chat_message(conversation_id, from, reply)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'faye/websocket'
|
2
|
+
require 'eventmachine'
|
3
|
+
require 'permessage_deflate'
|
4
|
+
|
5
|
+
module Beeline
|
6
|
+
class Client
|
7
|
+
include Beeline::Config
|
8
|
+
|
9
|
+
attr_reader :commands, :messages
|
10
|
+
|
11
|
+
INITIAL_LATCH = 0.01
|
12
|
+
MAX_LATCH = 3.0
|
13
|
+
|
14
|
+
def initialize(options = {})
|
15
|
+
@session = options[:session]
|
16
|
+
@url = options[:url] || BEE_WS_URL
|
17
|
+
@commands = options[:commands] || {}
|
18
|
+
@messages = options[:messages] || {}
|
19
|
+
@prefix = options[:prefix] || '$'
|
20
|
+
@latch = INITIAL_LATCH
|
21
|
+
@socket = nil
|
22
|
+
@thread_running = false
|
23
|
+
end
|
24
|
+
|
25
|
+
def reset_session
|
26
|
+
@session = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def run(options = {async: false})
|
30
|
+
async = !!options[:async]
|
31
|
+
start_thread(async) unless !!@thread_running
|
32
|
+
|
33
|
+
socket
|
34
|
+
end
|
35
|
+
|
36
|
+
def run_loop
|
37
|
+
loop do
|
38
|
+
start_thread(false) unless !!@thread_running
|
39
|
+
|
40
|
+
sleep [@latch *= 2, MAX_LATCH].min
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def ping
|
45
|
+
start = Time.now
|
46
|
+
|
47
|
+
puts 'Ping ... '
|
48
|
+
|
49
|
+
socket.ping('Ping!') do
|
50
|
+
puts "Pong! (#{Time.now - start})"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
private
|
54
|
+
def session
|
55
|
+
@session ||= Session.new
|
56
|
+
end
|
57
|
+
|
58
|
+
def socket
|
59
|
+
@socket ||= Faye::WebSocket::Client.new(BEE_WS_URL, [],
|
60
|
+
extensions: [PermessageDeflate],
|
61
|
+
headers: {
|
62
|
+
'User-Agent' => AGENT_ID,
|
63
|
+
'Cookie' => session.tokens
|
64
|
+
},
|
65
|
+
ping: WS_KEEPALIVE_TIME
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
def authenticate
|
70
|
+
if result = socket.send({type: 'authenticate', payload: {username: hive_account, token: session.ws_token}}.to_json)
|
71
|
+
puts "Authentication sent: #{session.inspect}"
|
72
|
+
|
73
|
+
ping
|
74
|
+
else
|
75
|
+
puts "Could not authenticate."
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def chat_message(conversation_id, to, message)
|
80
|
+
socket.send({type: 'chat-message', payload: {conversation_id: conversation_id, to: to, message: message}}.to_json)
|
81
|
+
end
|
82
|
+
|
83
|
+
# @private
|
84
|
+
def start_thread(async = false)
|
85
|
+
thread = Thread.new do
|
86
|
+
EM.run {
|
87
|
+
socket.on :open do |event|
|
88
|
+
p [:ws, [:open]]
|
89
|
+
authenticate
|
90
|
+
@thread_running = true
|
91
|
+
end
|
92
|
+
|
93
|
+
socket.on :message do |event|
|
94
|
+
data = JSON[event.data] rescue nil
|
95
|
+
|
96
|
+
if !!data && !!data['type'] && !!data['payload']
|
97
|
+
payload = data['payload']
|
98
|
+
|
99
|
+
case data['type']
|
100
|
+
when 'status' then process_status(payload)
|
101
|
+
when 'reauthentication-required' then session.refresh_token
|
102
|
+
when 'chat-message' then process_chat_message(payload)
|
103
|
+
when 'message-deleted' then process_message_deleted(payload)
|
104
|
+
when 'conversation-created' then process_conversation_created(payload)
|
105
|
+
when 'conversation-renamed' then process_conversation_renamed(payload)
|
106
|
+
when 'conversation-removed' then process_conversation_removed(payload)
|
107
|
+
when 'acknowledged' then process_acknowledged(payload)
|
108
|
+
when 'member-added' then process_member_added(payload)
|
109
|
+
when 'member-removed' then process_member_removed(payload)
|
110
|
+
when 'moderator-added' then process_moderator_added(payload)
|
111
|
+
when 'moderator-removed' then process_moderator_removed(payload)
|
112
|
+
when 'friendship-accepted' then process_friendship_accepted(payload)
|
113
|
+
when 'friendship-removed' then process_friendship_removed(payload)
|
114
|
+
when 'friendship-requested' then process_friendship_requested(payload)
|
115
|
+
when 'friendship-rejected' then process_friendship_rejected(payload)
|
116
|
+
when 'user-blocked' then process_user_blocked(payload)
|
117
|
+
when 'user-unblocked' then process_user_unblocked(payload)
|
118
|
+
else
|
119
|
+
p [:beechat_message, data['type'], data['payload']]
|
120
|
+
end
|
121
|
+
else
|
122
|
+
p [:ws, [:message, event.data]]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
socket.on :close do |event|
|
127
|
+
p [:ws, [:close, event.code, event.reason]]
|
128
|
+
@thread_running = false
|
129
|
+
@socket = nil
|
130
|
+
EM.stop
|
131
|
+
end
|
132
|
+
|
133
|
+
socket.on :error do |event|
|
134
|
+
p [:ws, [:error, event.message.inspect]]
|
135
|
+
@thread_running = false
|
136
|
+
@socket = nil
|
137
|
+
EM.stop
|
138
|
+
end
|
139
|
+
}
|
140
|
+
end
|
141
|
+
|
142
|
+
thread.join unless !!async
|
143
|
+
end
|
144
|
+
|
145
|
+
# Override to procsss.
|
146
|
+
def process_status(payload); end
|
147
|
+
|
148
|
+
# Override to procsss.
|
149
|
+
def process_chat_message(payload); end
|
150
|
+
|
151
|
+
# Override to procsss.
|
152
|
+
def process_message_deleted(payload); end
|
153
|
+
|
154
|
+
# Override to procsss.
|
155
|
+
def process_conversation_created(payload); end
|
156
|
+
|
157
|
+
# Override to procsss.
|
158
|
+
def process_conversation_renamed(payload); end
|
159
|
+
|
160
|
+
# Override to procsss.
|
161
|
+
def process_conversation_removed(payload); end
|
162
|
+
|
163
|
+
# Override to procsss.
|
164
|
+
def process_acknowledged(payload); end
|
165
|
+
|
166
|
+
# Override to procsss.
|
167
|
+
def process_member_added(payload); end
|
168
|
+
|
169
|
+
# Override to procsss.
|
170
|
+
def process_member_removed(payload); end
|
171
|
+
|
172
|
+
# Override to procsss.
|
173
|
+
def process_moderator_added(payload); end
|
174
|
+
|
175
|
+
# Override to procsss.
|
176
|
+
def process_moderator_removed(payload); end
|
177
|
+
|
178
|
+
# Override to procsss.
|
179
|
+
def process_friendship_accepted(payload); end
|
180
|
+
|
181
|
+
# Override to procsss.
|
182
|
+
def process_friendship_removed(payload); end
|
183
|
+
|
184
|
+
# Override to procsss.
|
185
|
+
def process_friendship_requested(payload); end
|
186
|
+
|
187
|
+
# Override to procsss.
|
188
|
+
def process_friendship_rejected(payload); end
|
189
|
+
|
190
|
+
# Override to procsss.
|
191
|
+
def process_user_blocked(payload); end
|
192
|
+
|
193
|
+
# Override to procsss.
|
194
|
+
def process_user_unblocked(payload); end
|
195
|
+
end
|
196
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Beeline
|
4
|
+
module Config
|
5
|
+
def hive_account
|
6
|
+
chain[:hive_account]
|
7
|
+
end
|
8
|
+
|
9
|
+
def hive_posting_wif
|
10
|
+
chain[:hive_posting_wif]
|
11
|
+
end
|
12
|
+
|
13
|
+
def hive_public_key
|
14
|
+
chain[:hive_public_key]
|
15
|
+
end
|
16
|
+
private
|
17
|
+
def chain
|
18
|
+
@chain_hash ||= yml[:chain]
|
19
|
+
end
|
20
|
+
|
21
|
+
def yml
|
22
|
+
return @yml if !!@yml
|
23
|
+
|
24
|
+
config_yaml_path = "#{Beeline::PWD}/config.yml"
|
25
|
+
|
26
|
+
@yml = if File.exist?(config_yaml_path)
|
27
|
+
YAML.load_file(config_yaml_path)
|
28
|
+
else
|
29
|
+
raise "Create a file: #{config_yaml_path}"
|
30
|
+
end
|
31
|
+
|
32
|
+
@yml
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
require 'hive'
|
2
|
+
require 'json'
|
3
|
+
require 'bitcoin'
|
4
|
+
require 'net/http'
|
5
|
+
require 'digest/sha2'
|
6
|
+
|
7
|
+
module Beeline
|
8
|
+
class Session
|
9
|
+
include Config
|
10
|
+
include Hive::Utils
|
11
|
+
|
12
|
+
attr_reader :ws_session, :cookies
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@base_uri = nil
|
16
|
+
@ws_uri = nil
|
17
|
+
@cookies = nil
|
18
|
+
@ws_session = nil
|
19
|
+
@http = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def base_uri
|
23
|
+
@base_uri ||= URI.parse(BEE_BASE_URL)
|
24
|
+
end
|
25
|
+
|
26
|
+
def ws_uri
|
27
|
+
@ws_uri ||= URI.parse(BEE_WS_URL)
|
28
|
+
end
|
29
|
+
|
30
|
+
def tokens
|
31
|
+
login if @cookies.nil?
|
32
|
+
|
33
|
+
return if @cookies.nil?
|
34
|
+
|
35
|
+
[
|
36
|
+
@cookies.split('; ').select{|t| t.start_with? 'token='}.first,
|
37
|
+
@cookies.split('; ').select{|t| t.start_with? 'refresh_token='}.first
|
38
|
+
].join('; ')
|
39
|
+
end
|
40
|
+
|
41
|
+
def ws_token
|
42
|
+
login if @ws_session.nil?
|
43
|
+
|
44
|
+
return if @ws_session.nil?
|
45
|
+
|
46
|
+
@ws_session['ws_token']
|
47
|
+
end
|
48
|
+
|
49
|
+
def http(&block)
|
50
|
+
Net::HTTP.start(base_uri.host, base_uri.port, use_ssl: base_uri.scheme == 'https') do |http|
|
51
|
+
yield http
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def login
|
56
|
+
return @ws_session if !!@ws_session
|
57
|
+
|
58
|
+
timestamp = (Time.now.to_f * 1000).to_i
|
59
|
+
message = "#{hive_account}#{timestamp}"
|
60
|
+
signature = hexlify sign_message message
|
61
|
+
resource = "#{base_uri.path}/users/login?username=#{hive_account}&ts=#{timestamp}&sig=#{signature}"
|
62
|
+
|
63
|
+
http do |http|
|
64
|
+
request = Net::HTTP::Get.new resource
|
65
|
+
request['User-Agent'] = AGENT_ID
|
66
|
+
response = http.request request
|
67
|
+
|
68
|
+
if response.code == '200'
|
69
|
+
@cookies = response['Set-Cookie']
|
70
|
+
@ws_session = JSON[response.body]
|
71
|
+
else
|
72
|
+
JSON[response.body]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def verify
|
78
|
+
raise "Unable to verify before logging in" unless !!@ws_session
|
79
|
+
|
80
|
+
resource = "#{base_uri.path}/users/verify"
|
81
|
+
|
82
|
+
http do |http|
|
83
|
+
request = Net::HTTP::Get.new resource
|
84
|
+
request['User-Agent'] = AGENT_ID
|
85
|
+
request['Cookie'] = tokens
|
86
|
+
response = http.request request
|
87
|
+
|
88
|
+
JSON[response.body]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def refresh_token
|
93
|
+
raise "Unable to refresh token before logging in" unless !!@ws_session
|
94
|
+
|
95
|
+
resource = "#{base_uri.path}/refresh-token"
|
96
|
+
|
97
|
+
http do |http|
|
98
|
+
request = Net::HTTP::Get.new resource
|
99
|
+
request['User-Agent'] = AGENT_ID
|
100
|
+
request['Cookie'] = tokens
|
101
|
+
response = http.request request
|
102
|
+
|
103
|
+
if response.code == '200'
|
104
|
+
@cookies = response['Set-Cookie']
|
105
|
+
@ws_session = JSON[response.body]
|
106
|
+
else
|
107
|
+
JSON[response.body]
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def get(resource)
|
113
|
+
raise "Unable to request #{resource} before logging in" unless !!@ws_session
|
114
|
+
|
115
|
+
resource = "#{base_uri.path}#{resource}"
|
116
|
+
|
117
|
+
http do |http|
|
118
|
+
request = Net::HTTP::Get.new resource
|
119
|
+
request['User-Agent'] = AGENT_ID
|
120
|
+
request['Cookie'] = tokens
|
121
|
+
response = http.request request
|
122
|
+
|
123
|
+
JSON[response.body]
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def friends; get('/users/friends'); end
|
128
|
+
def settings; get('/users/settings'); end
|
129
|
+
|
130
|
+
def settings=(new_settings)
|
131
|
+
raise "Unable to post settings before logging in" unless !!@ws_session
|
132
|
+
|
133
|
+
resource = "#{base_uri.path}/users/settings"
|
134
|
+
|
135
|
+
http do |http|
|
136
|
+
request = Net::HTTP::Post.new resource
|
137
|
+
request.body = new_settings.to_json
|
138
|
+
request['Content-Type'] = 'application/json; charset=UTF-8'
|
139
|
+
request['User-Agent'] = AGENT_ID
|
140
|
+
request['Cookie'] = tokens
|
141
|
+
response = http.request request
|
142
|
+
|
143
|
+
JSON[response.body]
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def channels; get('/users/channels'); end
|
148
|
+
|
149
|
+
def channels=(new_channels)
|
150
|
+
raise "Unable to post channels before logging in" unless !!@ws_session
|
151
|
+
|
152
|
+
resource = "#{base_uri.path}/users/channels"
|
153
|
+
|
154
|
+
http do |http|
|
155
|
+
request = Net::HTTP::Post.new resource
|
156
|
+
request.body = new_channels.to_json
|
157
|
+
request['Content-Type'] = 'application/json; charset=UTF-8'
|
158
|
+
request['User-Agent'] = AGENT_ID
|
159
|
+
request['Cookie'] = tokens
|
160
|
+
response = http.request request
|
161
|
+
|
162
|
+
JSON[response.body]
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def logout; get('/users/logout'); end
|
167
|
+
def conversations; get('/messages/conversations'); end
|
168
|
+
|
169
|
+
def conversation(*id)
|
170
|
+
raise "Unable to get conversation before logging in" unless !!@ws_session
|
171
|
+
|
172
|
+
id = [id].flatten
|
173
|
+
resource = "#{base_uri.path}/messages/conversation?ids=#{id.join(',')}"
|
174
|
+
|
175
|
+
http do |http|
|
176
|
+
request = Net::HTTP::Get.new resource
|
177
|
+
request['User-Agent'] = AGENT_ID
|
178
|
+
request['Cookie'] = tokens
|
179
|
+
response = http.request request
|
180
|
+
|
181
|
+
JSON[response.body]
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def new_conversations; get('/messages/new'); end
|
186
|
+
|
187
|
+
def chats(id, before = nil, limit = nil)
|
188
|
+
raise "Unable to get conversation before logging in" unless !!@ws_session
|
189
|
+
|
190
|
+
resource = "#{base_uri.path}/messages/chats?conversation_id=#{id}"
|
191
|
+
resource += "&before=#{before.utc.iso8601}" if !!before
|
192
|
+
resource += "&limit=#{limit}" if !!limit
|
193
|
+
|
194
|
+
http do |http|
|
195
|
+
request = Net::HTTP::Get.new resource
|
196
|
+
request['User-Agent'] = AGENT_ID
|
197
|
+
request['Cookie'] = tokens
|
198
|
+
response = http.request request
|
199
|
+
|
200
|
+
JSON[response.body]
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def dump_conversations
|
205
|
+
new_conversations.map{|c| "#{c['timestamp']} :: #{c['conversation_id']} :: #{c['from']}: #{c['content']}"}
|
206
|
+
end
|
207
|
+
|
208
|
+
def inspect
|
209
|
+
properties = %w(base_uri ws_uri ws_session).map do |prop|
|
210
|
+
if !!(v = instance_variable_get("@#{prop}"))
|
211
|
+
case v
|
212
|
+
when Array then "@#{prop}=<#{v.size} #{v.size == 1 ? 'element' : 'elements'}>"
|
213
|
+
else; "@#{prop}=#{v}"
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end.compact.join(', ')
|
217
|
+
|
218
|
+
"#<#{self.class} [#{properties}]>"
|
219
|
+
end
|
220
|
+
private
|
221
|
+
# @private
|
222
|
+
def sign_message(message)
|
223
|
+
digest_hex = Digest::SHA256.digest(message)
|
224
|
+
private_key = Bitcoin::Key.from_base58 hive_posting_wif
|
225
|
+
public_key = Bitcoin.decode_base58(hive_public_key[3..-1])[0..65]
|
226
|
+
|
227
|
+
Bitcoin::OpenSSL_EC.sign_compact(digest_hex, private_key.priv, public_key, true)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
metadata
ADDED
@@ -0,0 +1,399 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: beeline-rb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Anthony Martin
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-10-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.0.1
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.0.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rake
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '13.0'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 13.0.1
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '13.0'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 13.0.1
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: minitest
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '5.14'
|
60
|
+
- - '='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 5.14.2
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '5.14'
|
70
|
+
- - '='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 5.14.2
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: minitest-line
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0.6'
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.6.5
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.6'
|
90
|
+
- - '='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 0.6.5
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: webmock
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '3.9'
|
100
|
+
- - '='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 3.9.1
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '3.9'
|
110
|
+
- - '='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 3.9.1
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: vcr
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - '='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: 6.0.0
|
120
|
+
- - "~>"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '6.0'
|
123
|
+
type: :development
|
124
|
+
prerelease: false
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - '='
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: 6.0.0
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '6.0'
|
133
|
+
- !ruby/object:Gem::Dependency
|
134
|
+
name: simplecov
|
135
|
+
requirement: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - '='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 0.19.0
|
140
|
+
- - "~>"
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0.19'
|
143
|
+
type: :development
|
144
|
+
prerelease: false
|
145
|
+
version_requirements: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - '='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 0.19.0
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.19'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: yard
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.9'
|
160
|
+
- - '='
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: 0.9.25
|
163
|
+
type: :development
|
164
|
+
prerelease: false
|
165
|
+
version_requirements: !ruby/object:Gem::Requirement
|
166
|
+
requirements:
|
167
|
+
- - "~>"
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: '0.9'
|
170
|
+
- - '='
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 0.9.25
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: byebug
|
175
|
+
requirement: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - "~>"
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '11.1'
|
180
|
+
- - '='
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: 11.1.3
|
183
|
+
type: :development
|
184
|
+
prerelease: false
|
185
|
+
version_requirements: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - "~>"
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '11.1'
|
190
|
+
- - '='
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: 11.1.3
|
193
|
+
- !ruby/object:Gem::Dependency
|
194
|
+
name: pry
|
195
|
+
requirement: !ruby/object:Gem::Requirement
|
196
|
+
requirements:
|
197
|
+
- - "~>"
|
198
|
+
- !ruby/object:Gem::Version
|
199
|
+
version: '0.13'
|
200
|
+
- - '='
|
201
|
+
- !ruby/object:Gem::Version
|
202
|
+
version: 0.13.1
|
203
|
+
type: :development
|
204
|
+
prerelease: false
|
205
|
+
version_requirements: !ruby/object:Gem::Requirement
|
206
|
+
requirements:
|
207
|
+
- - "~>"
|
208
|
+
- !ruby/object:Gem::Version
|
209
|
+
version: '0.13'
|
210
|
+
- - '='
|
211
|
+
- !ruby/object:Gem::Version
|
212
|
+
version: 0.13.1
|
213
|
+
- !ruby/object:Gem::Dependency
|
214
|
+
name: pry-coolline
|
215
|
+
requirement: !ruby/object:Gem::Requirement
|
216
|
+
requirements:
|
217
|
+
- - "~>"
|
218
|
+
- !ruby/object:Gem::Version
|
219
|
+
version: '0.2'
|
220
|
+
- - '='
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: 0.2.5
|
223
|
+
type: :development
|
224
|
+
prerelease: false
|
225
|
+
version_requirements: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - "~>"
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0.2'
|
230
|
+
- - '='
|
231
|
+
- !ruby/object:Gem::Version
|
232
|
+
version: 0.2.5
|
233
|
+
- !ruby/object:Gem::Dependency
|
234
|
+
name: awesome_print
|
235
|
+
requirement: !ruby/object:Gem::Requirement
|
236
|
+
requirements:
|
237
|
+
- - '='
|
238
|
+
- !ruby/object:Gem::Version
|
239
|
+
version: 1.8.0
|
240
|
+
- - "~>"
|
241
|
+
- !ruby/object:Gem::Version
|
242
|
+
version: '1.8'
|
243
|
+
type: :development
|
244
|
+
prerelease: false
|
245
|
+
version_requirements: !ruby/object:Gem::Requirement
|
246
|
+
requirements:
|
247
|
+
- - '='
|
248
|
+
- !ruby/object:Gem::Version
|
249
|
+
version: 1.8.0
|
250
|
+
- - "~>"
|
251
|
+
- !ruby/object:Gem::Version
|
252
|
+
version: '1.8'
|
253
|
+
- !ruby/object:Gem::Dependency
|
254
|
+
name: irb
|
255
|
+
requirement: !ruby/object:Gem::Requirement
|
256
|
+
requirements:
|
257
|
+
- - "~>"
|
258
|
+
- !ruby/object:Gem::Version
|
259
|
+
version: '1.2'
|
260
|
+
- - '='
|
261
|
+
- !ruby/object:Gem::Version
|
262
|
+
version: 1.2.7
|
263
|
+
type: :development
|
264
|
+
prerelease: false
|
265
|
+
version_requirements: !ruby/object:Gem::Requirement
|
266
|
+
requirements:
|
267
|
+
- - "~>"
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
version: '1.2'
|
270
|
+
- - '='
|
271
|
+
- !ruby/object:Gem::Version
|
272
|
+
version: 1.2.7
|
273
|
+
- !ruby/object:Gem::Dependency
|
274
|
+
name: rb-readline
|
275
|
+
requirement: !ruby/object:Gem::Requirement
|
276
|
+
requirements:
|
277
|
+
- - "~>"
|
278
|
+
- !ruby/object:Gem::Version
|
279
|
+
version: '0.5'
|
280
|
+
- - '='
|
281
|
+
- !ruby/object:Gem::Version
|
282
|
+
version: 0.5.5
|
283
|
+
type: :development
|
284
|
+
prerelease: false
|
285
|
+
version_requirements: !ruby/object:Gem::Requirement
|
286
|
+
requirements:
|
287
|
+
- - "~>"
|
288
|
+
- !ruby/object:Gem::Version
|
289
|
+
version: '0.5'
|
290
|
+
- - '='
|
291
|
+
- !ruby/object:Gem::Version
|
292
|
+
version: 0.5.5
|
293
|
+
- !ruby/object:Gem::Dependency
|
294
|
+
name: hive-ruby
|
295
|
+
requirement: !ruby/object:Gem::Requirement
|
296
|
+
requirements:
|
297
|
+
- - '='
|
298
|
+
- !ruby/object:Gem::Version
|
299
|
+
version: 1.0.0
|
300
|
+
- - "~>"
|
301
|
+
- !ruby/object:Gem::Version
|
302
|
+
version: '1.0'
|
303
|
+
type: :runtime
|
304
|
+
prerelease: false
|
305
|
+
version_requirements: !ruby/object:Gem::Requirement
|
306
|
+
requirements:
|
307
|
+
- - '='
|
308
|
+
- !ruby/object:Gem::Version
|
309
|
+
version: 1.0.0
|
310
|
+
- - "~>"
|
311
|
+
- !ruby/object:Gem::Version
|
312
|
+
version: '1.0'
|
313
|
+
- !ruby/object:Gem::Dependency
|
314
|
+
name: faye-websocket
|
315
|
+
requirement: !ruby/object:Gem::Requirement
|
316
|
+
requirements:
|
317
|
+
- - '='
|
318
|
+
- !ruby/object:Gem::Version
|
319
|
+
version: 0.11.0
|
320
|
+
- - "~>"
|
321
|
+
- !ruby/object:Gem::Version
|
322
|
+
version: '0.11'
|
323
|
+
type: :runtime
|
324
|
+
prerelease: false
|
325
|
+
version_requirements: !ruby/object:Gem::Requirement
|
326
|
+
requirements:
|
327
|
+
- - '='
|
328
|
+
- !ruby/object:Gem::Version
|
329
|
+
version: 0.11.0
|
330
|
+
- - "~>"
|
331
|
+
- !ruby/object:Gem::Version
|
332
|
+
version: '0.11'
|
333
|
+
- !ruby/object:Gem::Dependency
|
334
|
+
name: permessage_deflate
|
335
|
+
requirement: !ruby/object:Gem::Requirement
|
336
|
+
requirements:
|
337
|
+
- - "~>"
|
338
|
+
- !ruby/object:Gem::Version
|
339
|
+
version: '0.1'
|
340
|
+
- - '='
|
341
|
+
- !ruby/object:Gem::Version
|
342
|
+
version: 0.1.4
|
343
|
+
type: :runtime
|
344
|
+
prerelease: false
|
345
|
+
version_requirements: !ruby/object:Gem::Requirement
|
346
|
+
requirements:
|
347
|
+
- - "~>"
|
348
|
+
- !ruby/object:Gem::Version
|
349
|
+
version: '0.1'
|
350
|
+
- - '='
|
351
|
+
- !ruby/object:Gem::Version
|
352
|
+
version: 0.1.4
|
353
|
+
description: HIVE centric BeeChat bot Framework.
|
354
|
+
email:
|
355
|
+
- beeline@martin-studio.com
|
356
|
+
executables: []
|
357
|
+
extensions: []
|
358
|
+
extra_rdoc_files: []
|
359
|
+
files:
|
360
|
+
- ".gitignore"
|
361
|
+
- Gemfile
|
362
|
+
- LICENSE
|
363
|
+
- README.md
|
364
|
+
- Rakefile
|
365
|
+
- beeline-rb.gemspec
|
366
|
+
- example-config.yml
|
367
|
+
- lib/beeline.rb
|
368
|
+
- lib/beeline/bot.rb
|
369
|
+
- lib/beeline/client.rb
|
370
|
+
- lib/beeline/config.rb
|
371
|
+
- lib/beeline/session.rb
|
372
|
+
- lib/beeline/version.rb
|
373
|
+
- support/320-logo-2020-10-08 14-08.png
|
374
|
+
- support/logo-2020-10-08 14-08.png
|
375
|
+
- support/logo-2020-10-08 14-08.xcf
|
376
|
+
homepage: https://github.com/inertia186/beeline-rb
|
377
|
+
licenses:
|
378
|
+
- CC0 1.0
|
379
|
+
metadata: {}
|
380
|
+
post_install_message:
|
381
|
+
rdoc_options: []
|
382
|
+
require_paths:
|
383
|
+
- lib
|
384
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
385
|
+
requirements:
|
386
|
+
- - ">="
|
387
|
+
- !ruby/object:Gem::Version
|
388
|
+
version: '0'
|
389
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
390
|
+
requirements:
|
391
|
+
- - ">="
|
392
|
+
- !ruby/object:Gem::Version
|
393
|
+
version: '0'
|
394
|
+
requirements: []
|
395
|
+
rubygems_version: 3.0.8
|
396
|
+
signing_key:
|
397
|
+
specification_version: 4
|
398
|
+
summary: Bot Framework for BeeChat
|
399
|
+
test_files: []
|