ezii 0.0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ezii-client/Gemfile +6 -0
- data/ezii-client/Gemfile.lock +32 -0
- data/ezii-client/Procfile +2 -0
- data/ezii-client/README.md +16 -0
- data/ezii-client/chat.txt +1446 -0
- data/ezii-client/config.ru +1 -0
- data/ezii-client/fake.rb +5 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/functions/base_command.rb +26 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/functions/mouse_y_axis_to_3d_z_axis.rb +4 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/functions/record_audio_and_send_to_wit.rb +18 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/functions/rotate_camera_axis_using_mouse_drag.rb +37 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/functions/selection_cube.rb +35 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/gam.rb +388 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/gems.locked +75 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/gems.rb +10 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/lib/drb_server.rb +13 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/lib/mittsu_monkeypatches/box_geometry.rb +5 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/runnable.rb +20 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/shapes/cube.rb +29 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/sig/runable.rbi +9 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/test.sh +5 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/test/commands/test_move_cube.rb +18 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/test/commands/test_selection_cube.rb +31 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/test/test_command_remapping.rb +30 -0
- data/ezii-client/managables/programs/game_aided_manufacturing/test/test_helper.rb +75 -0
- data/ezii-client/managables/services/chat-bot-integrations/chat.txt +15 -0
- data/ezii-client/managables/services/chat-bot-integrations/gems.locked +66 -0
- data/ezii-client/managables/services/chat-bot-integrations/gems.rb +18 -0
- data/ezii-client/managables/services/chat-bot-integrations/gitter_zircon.rb +644 -0
- data/ezii-client/managables/services/chat-bot-integrations/regexes.rb +240 -0
- data/ezii-client/managables/services/chat-bot-integrations/setup-mac-os-x.sh +0 -0
- data/ezii-client/managables/services/chat-bot-integrations/setup.sh +1 -0
- data/ezii-client/managables/services/chat-bot-integrations/start.sh +3 -0
- data/ezii-client/managables/services/error-inspect/simplest-log +1 -0
- data/ezii-client/managables/services/error-inspect/simplest-log-init +1 -0
- data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/ascii_nebuchadnezzar +9 -0
- data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/chat.txt +1 -0
- data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/twitch_zircon.rb +61 -0
- data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/zion_fleet.rb +198 -0
- data/ezii-client/managables/services/livestream-interactive/chat.txt +40 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/README.md +3 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/__main__.js +58 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/black-out-random-word.js +74 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-sentence.js +57 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-wikipedia-page.js +25 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-words.js +34 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/rare-enough-word.js +41 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/wikipedia-page.js +35 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/package.json +20 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/statistics/count-word.js +12 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/utils/log-to-natural-database.js +10 -0
- data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/word2vec-models/test-text8-vector.bin +0 -0
- data/ezii-client/managament_interface/gems.locked +13 -0
- data/ezii-client/managament_interface/gems.rb +3 -0
- data/ezii-client/managament_interface/management_interface +4 -0
- data/ezii-client/managament_interface/runnable.rb +30 -0
- data/ezii-client/rocknrolla +1 -0
- data/ezii-client/start.sh +2 -0
- data/ezii-client/test.wav +0 -0
- data/ezii-misc/detect-intent-from-git-patch.rb +46 -0
- data/ezii-server/Gemfile +23 -0
- data/ezii-server/Gemfile.lock +84 -0
- data/ezii-server/README.md +13 -0
- data/ezii-server/config.ru +2 -0
- data/ezii-server/eezee.rb +1243 -0
- data/ezii-server/httpsprojecteulernetproblem=155.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=205.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=228.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=262.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=3.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=333.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=334.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=337.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=426.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=442.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=449.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=497.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=51.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=514.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=520.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=571.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=587.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=588.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=599.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=72.png +0 -0
- data/ezii-server/httpsprojecteulernetproblem=93.png +0 -0
- data/ezii-server/regexes +258 -0
- data/ezii-server/sample.wav +0 -0
- data/ezii.gemspec +13 -0
- metadata +132 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'ruby2d'
|
2
|
+
|
3
|
+
# Set the window size
|
4
|
+
set width: 400, height: 400
|
5
|
+
|
6
|
+
set title: "Fun first"
|
7
|
+
|
8
|
+
Text.new('Managables', y: 0)
|
9
|
+
Text.new(' Games', y: 20)
|
10
|
+
Text.new(' Game Aided Manufacturing', y: 40)
|
11
|
+
|
12
|
+
|
13
|
+
Text.new(' Services', y: 60)
|
14
|
+
Text.new(' Error Web App', y: 80)
|
15
|
+
Text.new(' Vision/OCR', y: 100)
|
16
|
+
Text.new(' Livestream Interactive', y: 120)
|
17
|
+
|
18
|
+
|
19
|
+
on :mouse_up do |event|
|
20
|
+
# x and y coordinates of the mouse button event
|
21
|
+
case event.button
|
22
|
+
when :left
|
23
|
+
puts event.x
|
24
|
+
puts event.y
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# Show the window
|
30
|
+
show
|
@@ -0,0 +1 @@
|
|
1
|
+
rackup
|
Binary file
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'json'
|
3
|
+
require 'wit'
|
4
|
+
|
5
|
+
set :protection, :except => :frame_options
|
6
|
+
set :bind, '0.0.0.0'
|
7
|
+
|
8
|
+
ENV['WIT_AI_TOKEN'] = "NKALLR6ED2Q7EI3PH4URT7Y7FQMJWM4P"
|
9
|
+
|
10
|
+
REPO_PATHS = [
|
11
|
+
'tootsuite/mastodon',
|
12
|
+
'rails/rails',
|
13
|
+
'facebook/relay',
|
14
|
+
'tensorflow/tensorflow'
|
15
|
+
]
|
16
|
+
|
17
|
+
|
18
|
+
search_terms = ["machine+learning", "rails"]
|
19
|
+
repos_json = `curl -u ezii123:b6c3c55c3307e21f9c7f387bcc4d3ae38a30e412 https://api.github.com/search/repositories?q=#{search_terms.sample}&sort=updated`
|
20
|
+
parsed_json = JSON.parse(repos_json)
|
21
|
+
|
22
|
+
parsed_json["items"].each do |repo_hash|
|
23
|
+
REPO_PATHS.push(repo_hash["full_name"])
|
24
|
+
end
|
25
|
+
|
26
|
+
get '/' do
|
27
|
+
|
28
|
+
case params[:message]
|
29
|
+
when 'do something'
|
30
|
+
json = `curl -u ezii123:b6c3c55c3307e21f9c7f387bcc4d3ae38a30e412 https://api.github.com/repos/#{REPO_PATHS.sample}/commits/master`
|
31
|
+
parsed_json = JSON.parse(json)
|
32
|
+
p parsed_json
|
33
|
+
message = parsed_json["files"][0]["patch"].to_s
|
34
|
+
|
35
|
+
client = Wit.new(access_token: ENV["WIT_AI_TOKEN"])
|
36
|
+
response = client.message(message)
|
37
|
+
|
38
|
+
return response.to_s
|
39
|
+
when "ezii-dev what are you doing?"
|
40
|
+
# return "Help with development of eezi-ruby"
|
41
|
+
erb :index, :locals => { host: request.host }
|
42
|
+
# when /.*608730770953076786.*debug.*`(.*)`.*/
|
43
|
+
# erb :minimalistic_debug, :locals => { code: $1 }
|
44
|
+
# # return "ohohohoho you fool I\'M UR MASTER'"
|
45
|
+
end
|
46
|
+
end
|
data/ezii-server/Gemfile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
gem 'rack'
|
4
|
+
gem 'zircon'
|
5
|
+
gem 'colorize'
|
6
|
+
gem 'byebug'
|
7
|
+
gem 'gyazo'
|
8
|
+
gem 'open4'
|
9
|
+
gem 'brainz'
|
10
|
+
gem 'bundler'
|
11
|
+
gem 'sinatra'
|
12
|
+
gem 'nokogiri'
|
13
|
+
gem 'wit'
|
14
|
+
gem 'eezee_regexes'
|
15
|
+
gem 'facets'
|
16
|
+
gem 'polynomials'
|
17
|
+
gem 'mathn'
|
18
|
+
gem 'screencap'
|
19
|
+
gem 'json2table'
|
20
|
+
gem 'rake'
|
21
|
+
gem 'gnuplot'
|
22
|
+
gem 'mathn'
|
23
|
+
gem 'activesupport'
|
@@ -0,0 +1,84 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activesupport (5.2.3)
|
5
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
6
|
+
i18n (>= 0.7, < 2)
|
7
|
+
minitest (~> 5.1)
|
8
|
+
tzinfo (~> 1.1)
|
9
|
+
brainz (0.2.0)
|
10
|
+
byebug (11.0.1)
|
11
|
+
colorize (0.8.1)
|
12
|
+
concurrent-ruby (1.1.5)
|
13
|
+
eezee_regexes (0.1.5)
|
14
|
+
facets (3.1.0)
|
15
|
+
faraday (0.15.4)
|
16
|
+
multipart-post (>= 1.2, < 3)
|
17
|
+
gnuplot (2.6.2)
|
18
|
+
gyazo (3.0.1)
|
19
|
+
faraday
|
20
|
+
mime-types
|
21
|
+
multipart-post
|
22
|
+
i18n (1.6.0)
|
23
|
+
concurrent-ruby (~> 1.0)
|
24
|
+
json2table (1.0.7)
|
25
|
+
mathn (0.1.0)
|
26
|
+
mime-types (3.2.2)
|
27
|
+
mime-types-data (~> 3.2015)
|
28
|
+
mime-types-data (3.2019.0331)
|
29
|
+
mini_portile2 (2.4.0)
|
30
|
+
minitest (5.11.3)
|
31
|
+
multipart-post (2.1.1)
|
32
|
+
mustermann (1.0.3)
|
33
|
+
nokogiri (1.10.3)
|
34
|
+
mini_portile2 (~> 2.4.0)
|
35
|
+
open4 (1.3.4)
|
36
|
+
phantomjs (2.1.1.0)
|
37
|
+
polynomials (0.4.4)
|
38
|
+
activesupport
|
39
|
+
i18n
|
40
|
+
rack (2.0.7)
|
41
|
+
rack-protection (2.0.5)
|
42
|
+
rack
|
43
|
+
rake (12.3.3)
|
44
|
+
screencap (0.1.4)
|
45
|
+
phantomjs
|
46
|
+
sinatra (2.0.5)
|
47
|
+
mustermann (~> 1.0)
|
48
|
+
rack (~> 2.0)
|
49
|
+
rack-protection (= 2.0.5)
|
50
|
+
tilt (~> 2.0)
|
51
|
+
thread_safe (0.3.6)
|
52
|
+
tilt (2.0.9)
|
53
|
+
tzinfo (1.2.5)
|
54
|
+
thread_safe (~> 0.1)
|
55
|
+
wit (6.0.0)
|
56
|
+
zircon (0.0.8)
|
57
|
+
|
58
|
+
PLATFORMS
|
59
|
+
ruby
|
60
|
+
|
61
|
+
DEPENDENCIES
|
62
|
+
activesupport
|
63
|
+
brainz
|
64
|
+
bundler
|
65
|
+
byebug
|
66
|
+
colorize
|
67
|
+
eezee_regexes
|
68
|
+
facets
|
69
|
+
gnuplot
|
70
|
+
gyazo
|
71
|
+
json2table
|
72
|
+
mathn
|
73
|
+
nokogiri
|
74
|
+
open4
|
75
|
+
polynomials
|
76
|
+
rack
|
77
|
+
rake
|
78
|
+
screencap
|
79
|
+
sinatra
|
80
|
+
wit
|
81
|
+
zircon
|
82
|
+
|
83
|
+
BUNDLED WITH
|
84
|
+
2.0.2
|
@@ -0,0 +1,1243 @@
|
|
1
|
+
|
2
|
+
require 'zircon'
|
3
|
+
require 'colorize'
|
4
|
+
require 'byebug'
|
5
|
+
require 'json'
|
6
|
+
require 'date'
|
7
|
+
require 'timeout'
|
8
|
+
require 'gyazo'
|
9
|
+
require 'open4'
|
10
|
+
require 'brainz'
|
11
|
+
require 'bundler'
|
12
|
+
require 'sinatra'
|
13
|
+
require 'nokogiri'
|
14
|
+
require 'eezee_regexes'
|
15
|
+
|
16
|
+
require 'bigdecimal'
|
17
|
+
|
18
|
+
require 'json2table'
|
19
|
+
|
20
|
+
require 'rake'
|
21
|
+
require 'active_support/all'
|
22
|
+
|
23
|
+
class Bomb
|
24
|
+
def throw
|
25
|
+
return """
|
26
|
+
```
|
27
|
+
Local variables (5 first)
|
28
|
+
#{local_variables.sample(5)}
|
29
|
+
|
30
|
+
Instance variables (5 first)
|
31
|
+
#{instance_variables.sample(5)}
|
32
|
+
|
33
|
+
Public methods (5 first)
|
34
|
+
#{public_methods.sample(5)}
|
35
|
+
|
36
|
+
ENV (120 first chars)
|
37
|
+
#{ENV.inspect[0...120]}
|
38
|
+
|
39
|
+
```
|
40
|
+
"""
|
41
|
+
end
|
42
|
+
end
|
43
|
+
EEZEE_PREFIX = "eezee "
|
44
|
+
ANSWERS = Hash.new { |hash, key| hash[key] = Hash.new }
|
45
|
+
CURRENT_DISCORD_MESSAGE = Hash.new
|
46
|
+
|
47
|
+
class ::Integer
|
48
|
+
def direction
|
49
|
+
self/self.abs
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
class Number
|
55
|
+
def initialize(string_representation_from_discord, source="discord")
|
56
|
+
@source = source
|
57
|
+
@string_representation_from_discord = string_representation_from_discord
|
58
|
+
end
|
59
|
+
|
60
|
+
def to_s
|
61
|
+
"""
|
62
|
+
NUMBER
|
63
|
+
STRING REPRESENTATION FROM #{@source.upcase}
|
64
|
+
#{@string_representation_from_discord}
|
65
|
+
|
66
|
+
RUBY #{RUBY_ENGINE} #{RUBY_VERSION} FLOAT
|
67
|
+
#{@string_representation_from_discord.to_f}
|
68
|
+
|
69
|
+
RUBY #{RUBY_ENGINE} #{RUBY_VERSION} BIG DECIMAL
|
70
|
+
#{BigDecimal(@string_representation_from_discord)}
|
71
|
+
|
72
|
+
RUBY #{RUBY_ENGINE} #{RUBY_VERSION} INTEGER
|
73
|
+
#{@string_representation_from_discord.to_i}
|
74
|
+
|
75
|
+
PYTHON #{"runtime X"} #{"version X"} INTEGER
|
76
|
+
tbi by @gurrenm3 or @gurrenm4
|
77
|
+
PYTHON #{"runtime X"} #{"version X"} FLOAT
|
78
|
+
tbi by @gurrenm3 or @gurrenm4
|
79
|
+
"""
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class Function
|
84
|
+
attr_accessor :input_variables, :output_variables, :string_from_discord
|
85
|
+
|
86
|
+
def initialize
|
87
|
+
self.input_variables = []
|
88
|
+
self.output_variables = []
|
89
|
+
end
|
90
|
+
|
91
|
+
def evaluate
|
92
|
+
case string_from_discord
|
93
|
+
when "NeuralNetwork()"
|
94
|
+
return NeuralNetwork().verbose_introspect(very_verbose=true)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def compute(*args)
|
99
|
+
if @compute_type
|
100
|
+
case @compute_type
|
101
|
+
when :convert_to_integer_then_sum
|
102
|
+
return args.map(&:to_i).reduce(:+)
|
103
|
+
when :sum
|
104
|
+
return args.public_send(@compute_type)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
return args
|
109
|
+
end
|
110
|
+
|
111
|
+
def compute_is(compute_type)
|
112
|
+
@compute_type = compute_type
|
113
|
+
end
|
114
|
+
|
115
|
+
def to_s
|
116
|
+
"Function"
|
117
|
+
end
|
118
|
+
|
119
|
+
def explain
|
120
|
+
"""
|
121
|
+
This command creates a new function ƒ(x) = y
|
122
|
+
|
123
|
+
ƒ
|
124
|
+
|
125
|
+
Mac OS X: press option and f simultaniously
|
126
|
+
Windows:
|
127
|
+
On a computer running Microsoft Windows and using the Windows-1252 character encoding, the minuscule can be input using alt+159 or alt+0131.
|
128
|
+
Look up at wikipedia and search for ƒ
|
129
|
+
Linux:
|
130
|
+
Copy & Paste ƒ (maybe a clipboard manager?) ofc you rule the world
|
131
|
+
"""
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
class Method
|
136
|
+
def source(limit=10)
|
137
|
+
file, line = source_location
|
138
|
+
if file && line
|
139
|
+
IO.readlines(file)[line-1,limit]
|
140
|
+
else
|
141
|
+
nil
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
class NeuralNetwork
|
147
|
+
# TODO: DelegateAllMissingMethodsTo @brainz
|
148
|
+
|
149
|
+
def method_missing(method, *args, &block)
|
150
|
+
@brainz.public_send(method, *args, &block)
|
151
|
+
end
|
152
|
+
|
153
|
+
def initialize
|
154
|
+
@brainz = Brainz::Brainz.new
|
155
|
+
end
|
156
|
+
|
157
|
+
def verbose_introspect(very_verbose = false)
|
158
|
+
var = <<~HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
|
159
|
+
```
|
160
|
+
Brainz Rubygem (wrapper)
|
161
|
+
Ruby object id: #{@brainz.object_id}
|
162
|
+
```
|
163
|
+
|
164
|
+
```
|
165
|
+
Instance variables
|
166
|
+
```
|
167
|
+
|
168
|
+
```
|
169
|
+
#{@brainz.instance_variables}
|
170
|
+
```
|
171
|
+
HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
|
172
|
+
|
173
|
+
if very_verbose
|
174
|
+
var = <<~HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
|
175
|
+
```
|
176
|
+
Public methods (random sample of 3)
|
177
|
+
```
|
178
|
+
|
179
|
+
```
|
180
|
+
#{(@brainz.public_methods - Object.new.public_methods).sample(3).join("\n")}
|
181
|
+
```
|
182
|
+
HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
|
183
|
+
end
|
184
|
+
|
185
|
+
|
186
|
+
unless @brainz.network.nil?
|
187
|
+
# var += <<~HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
|
188
|
+
# ```
|
189
|
+
# #{@brainz.network.input.to_s}
|
190
|
+
# #{@brainz.network.hidden.to_s}
|
191
|
+
# #{@brainz.network.output.to_s}
|
192
|
+
# ```
|
193
|
+
# HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
|
194
|
+
end
|
195
|
+
|
196
|
+
return var
|
197
|
+
end
|
198
|
+
|
199
|
+
def to_s
|
200
|
+
verbose_introspect
|
201
|
+
end
|
202
|
+
|
203
|
+
end
|
204
|
+
|
205
|
+
def NeuralNetwork()
|
206
|
+
NeuralNetwork.new
|
207
|
+
end
|
208
|
+
|
209
|
+
class GitterDumbDevBot
|
210
|
+
def initialize
|
211
|
+
@currently_selected_project = "lemonandroid/gam"
|
212
|
+
@variables_for_chat_users = Hash.new
|
213
|
+
@players = Hash.new do |dictionary, identifier|
|
214
|
+
dictionary[identifier] = Hash.new
|
215
|
+
end
|
216
|
+
@melting_point_receivables = ["puts 'hello word'"]
|
217
|
+
@probes = []
|
218
|
+
@melted_liquids = []
|
219
|
+
@sent_messages = []
|
220
|
+
|
221
|
+
|
222
|
+
# SEC-IMPORTANT
|
223
|
+
|
224
|
+
@took_off = true
|
225
|
+
end
|
226
|
+
|
227
|
+
def unsafe!
|
228
|
+
@took_off = false
|
229
|
+
end
|
230
|
+
|
231
|
+
def load()
|
232
|
+
return if ENV["RACK_ENV"] == 'production'
|
233
|
+
|
234
|
+
warn and return [:info, :no_marshaled_data_found].join(' > ') unless File.exists?("/var/gam-discord-bot.ruby-marshal")
|
235
|
+
data = File.read("/var/gam-discord-bot.ruby-marshal")
|
236
|
+
@melting_point_receivables = Marshal.load(data)
|
237
|
+
end
|
238
|
+
|
239
|
+
def dump()
|
240
|
+
return if ENV["RACK_ENV"] == 'production'
|
241
|
+
require 'facets'
|
242
|
+
|
243
|
+
data = Marshal.dump(@melting_point_receivables)
|
244
|
+
File.rewrite("/var/gam-discord-bot.ruby-marshal") do |_previous_file_content_string|
|
245
|
+
data
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
def twitch_username_from_url(url)
|
250
|
+
url.match(/\/(\w*)\Z/)[1]
|
251
|
+
end
|
252
|
+
|
253
|
+
def record_live_stream_video_and_upload_get_url(url:, duration_seonds:)
|
254
|
+
twitch_username = twitch_username_from_url(url)
|
255
|
+
twitch_broadcaster_id = JSON.parse(`curl -H 'Authorization: Bearer #{ENV['EZE_TWITCH_TOKEN']}' \
|
256
|
+
-X GET 'https://api.twitch.tv/helix/users?login=#{twitch_username}'`)["data"][0]["id"]
|
257
|
+
created_clip_json_response = `curl -H 'Authorization: Bearer #{ENV['EZE_TWITCH_TOKEN']}' \
|
258
|
+
-X POST 'https://api.twitch.tv/helix/clips?broadcaster_id=#{twitch_broadcaster_id}'`
|
259
|
+
|
260
|
+
created_clip_json_response = JSON.parse(created_clip_json_response)
|
261
|
+
|
262
|
+
id = created_clip_json_response["data"][0]["id"]
|
263
|
+
return "https://clips.twitch.tv/#{id}"
|
264
|
+
|
265
|
+
# return `curl -H 'Authorization: Bearer #{ENV['EZE_TWITCH_TOKEN']}' \
|
266
|
+
# -X GET '#{url}'`
|
267
|
+
end
|
268
|
+
|
269
|
+
def get_string_of_x_bytes_by_curling_url(url:, byte_count:)
|
270
|
+
str = `curl #{url}`
|
271
|
+
sub_zero_string = str.each_char.reduce("") do |acc, chr| # haha, sub sero string
|
272
|
+
unless acc.bytesize === byte_count
|
273
|
+
acc += chr
|
274
|
+
else
|
275
|
+
break acc
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
"`#{sub_zero_string.unpack('c*')}`"
|
280
|
+
end
|
281
|
+
|
282
|
+
puts "test"
|
283
|
+
puts "eezee"
|
284
|
+
puts "what?"
|
285
|
+
puts "132423"
|
286
|
+
puts "practice"
|
287
|
+
puts "crazy"
|
288
|
+
p "crazy practice"
|
289
|
+
p "brasil"
|
290
|
+
p "circle"
|
291
|
+
p "circle of humans"
|
292
|
+
p "fc barcelona"
|
293
|
+
p "circle passing training game"
|
294
|
+
p "forgot what it's called"
|
295
|
+
p "i you seek my help, i expect you to be using gyazo.com gifs to communicate bugs / non-functional stuff"
|
296
|
+
|
297
|
+
|
298
|
+
p <<~TEST
|
299
|
+
any one here?
|
300
|
+
|
301
|
+
Send a message in Discord twitch_username
|
302
|
+
|
303
|
+
You can see the discord channel link at B O T C O M P A N Y . D E
|
304
|
+
|
305
|
+
https://gyazo.com/c16ec1dd35409c7eac9642dc013da920
|
306
|
+
TEST
|
307
|
+
|
308
|
+
require 'net/http'
|
309
|
+
def on_message(message, message_id, channel_id, user_id)
|
310
|
+
if ENV['HEROKU_DISCORD_CONFIGURABLE'] == 'true'
|
311
|
+
allowed_channels = ENV['ALLOWED_CHANNELS'] || [602625635633856513, 601874263666065411, 609100317899882527]
|
312
|
+
else
|
313
|
+
allowed_channels = [601874263666065411, 602625635633856513, 609100317899882527]
|
314
|
+
|
315
|
+
end
|
316
|
+
|
317
|
+
if channel_id.present? && !allowed_channels.include?(channel_id.to_i)
|
318
|
+
return ""
|
319
|
+
end
|
320
|
+
|
321
|
+
if message === "get last message id"
|
322
|
+
return CURRENT_DISCORD_MESSAGE[:mesage_id]
|
323
|
+
end
|
324
|
+
|
325
|
+
CURRENT_DISCORD_MESSAGE[:mesage_id] = message_id
|
326
|
+
|
327
|
+
require 'wit'
|
328
|
+
client = Wit.new(access_token: ENV["WIT_AI_TOKEN"])
|
329
|
+
response = client.message(message)
|
330
|
+
|
331
|
+
if !response.nil? && !response["entities"].empty? && !response["entities"]["intent"].blank?
|
332
|
+
if !response.nil? && !response["entities"].empty? && response["entities"]["intent"][0]["value"] === "new_functionalities_template_idea"
|
333
|
+
if rand() > 0.9
|
334
|
+
return response.inspect
|
335
|
+
end
|
336
|
+
return "Maybe you lack ideas?" if response["entities"]["idea"].blank? or response["entities"]["search_query"].blank?
|
337
|
+
# qanda_iframe_url = "https://github.com/search?q=#{CGI.escape(search_query)}"
|
338
|
+
|
339
|
+
# iframe_url = "https://gitlab.com/search?utf8=%E2%9C%93&search=#{CGI.escape(search_query)}&group_id=&project_id=&repository_ref=&nav_source=navbar"
|
340
|
+
|
341
|
+
if rand() < 0.1
|
342
|
+
idea = response["entities"]["idea"][0]["value"]
|
343
|
+
qanda_iframe_url = "https://agi.blue/?q=#{CGI.escape(idea)}"
|
344
|
+
elsif rand() < 0.5
|
345
|
+
idea = response["entities"]["search_query"][0]["value"]
|
346
|
+
qanda_iframe_url = "https://agi.blue/?q=#{CGI.escape(idea)}"
|
347
|
+
end
|
348
|
+
|
349
|
+
return "https://unique-swing.glitch.me/?myParam=#{CGI.escape(qanda_iframe_url)}"
|
350
|
+
end
|
351
|
+
|
352
|
+
if !response.nil? && !response["entities"].empty? && response["entities"]["intent"][0]["value"] === "new_functionalities_free_form_search"
|
353
|
+
search_query = response["entities"]["search_query"][0]["value"]
|
354
|
+
# qanda_iframe_url = "https://github.com/search?q=#{CGI.escape(search_query)}"
|
355
|
+
|
356
|
+
# qanda_iframe_url = "https://gitlab.com/search?utf8=%E2%9C%93&search=#{CGI.escape(search_query)}&group_id=&project_id=&repository_ref=&nav_source=navbar"
|
357
|
+
qanda_iframe_url = "https://agi.blue/?q=#{CGI.escape(search_query)}"
|
358
|
+
|
359
|
+
return "https://unique-swing.glitch.me/?myParam=#{CGI.escape(qanda_iframe_url)}"
|
360
|
+
end
|
361
|
+
|
362
|
+
if !response.nil? && !response["entities"].empty? && response["entities"]["intent"][0]["value"] === "offer_cool_new_functionalities"
|
363
|
+
return """
|
364
|
+
1: New regex command :)
|
365
|
+
2: New wit.ai entity :(
|
366
|
+
3: New functionality idea :'D
|
367
|
+
4: Free form search :diamond:
|
368
|
+
5: Consume new github source link Kappa
|
369
|
+
|
370
|
+
Please vote via emojis
|
371
|
+
"""
|
372
|
+
end
|
373
|
+
|
374
|
+
|
375
|
+
if !response.nil? && !response["entities"].empty? && response["entities"]["intent"][0]["value"] === "question-about-eezee-probe"
|
376
|
+
answer_api_response = `curl -XGET 'https://api.wit.ai/samples?entity_ids=intent&entity_values=explain-eezee-probe&limit=10' \
|
377
|
+
-H "Authorization: Bearer $WIT_AI_TOKEN"`
|
378
|
+
|
379
|
+
if !answer_api_response.nil? && JSON.parse(answer_api_response).any?
|
380
|
+
return JSON.parse(answer_api_response).sample["text"]
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
# if !response
|
385
|
+
# return response.inspect
|
386
|
+
# end
|
387
|
+
|
388
|
+
if response && response["entities"].any? && response["entities"]["intent"].map { |intent| intent["value"] }.any? { |intent_value| intent_value === "explain-eezee-probe" }
|
389
|
+
answer_api_response = `curl -XGET 'https://api.wit.ai/samples?entity_ids=intent&entity_values=explain-eezee-probe&limit=10' \
|
390
|
+
-H "Authorization: Bearer $WIT_AI_TOKEN"`
|
391
|
+
|
392
|
+
if !answer_api_response.nil? && JSON.parse(answer_api_response).any?
|
393
|
+
return JSON.parse(answer_api_response).sample["text"]
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
return response.inspect if rand() > 0.7
|
398
|
+
|
399
|
+
message_for_discord = response.inspect.gsub(/<@(\d+)>/, '<@ \1>')
|
400
|
+
|
401
|
+
url = "https://botcompany.de/1024081/raw?_pass=#{ENV['BOTCOMPANY']}&server=next-gen+bots&channel=#{602625635633856513}&post=#{CGI.escape(message_for_discord)}"
|
402
|
+
|
403
|
+
uri = URI(url)
|
404
|
+
Net::HTTP.get(uri)
|
405
|
+
|
406
|
+
# if /run asm #{url_regex}/ === message
|
407
|
+
# asm = `curl #{$1}`
|
408
|
+
# t = Tempfile.new(['asm', '.asm'])
|
409
|
+
# t.write(asm)
|
410
|
+
|
411
|
+
# `nasm -f macho64 #{t.path}`
|
412
|
+
# `ld -macosx_version_min 10.7.0 -lSystem -o hello #{t.path.ext('o')}`
|
413
|
+
# byebug
|
414
|
+
# return `./hello`
|
415
|
+
# end
|
416
|
+
|
417
|
+
if /\Aget cpu instructions set\Z/ === message
|
418
|
+
return `sysctl -a | grep cpu.feat`
|
419
|
+
end
|
420
|
+
|
421
|
+
if /\Ais eeZee ejected\?\Z/ === message
|
422
|
+
if @ejected == true
|
423
|
+
return "Yes, @eeZee is ejected"
|
424
|
+
else
|
425
|
+
return "No, @eeZee should still respond"
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
if /explain context/ === message
|
430
|
+
return """
|
431
|
+
it: the overall subject
|
432
|
+
this: the most nearest subject
|
433
|
+
that: the subject a bit farer then this (dimension for farer could be time, location, logic, etc)
|
434
|
+
"""
|
435
|
+
end
|
436
|
+
|
437
|
+
|
438
|
+
if /dev (.*)/ === message
|
439
|
+
begin
|
440
|
+
`git clone https://github.com/pickhardt/betty`
|
441
|
+
ensure
|
442
|
+
return `ruby ./betty/main.rb #{$1}`
|
443
|
+
end
|
444
|
+
end
|
445
|
+
|
446
|
+
return "" if @ejected
|
447
|
+
|
448
|
+
|
449
|
+
if (commands = message.split("|")).count > 1
|
450
|
+
|
451
|
+
result = nil
|
452
|
+
commands.each do |command|
|
453
|
+
result = self.on_message(command.rstrip)
|
454
|
+
|
455
|
+
@last_pipe = result
|
456
|
+
end
|
457
|
+
|
458
|
+
return result.inspect[0...500]
|
459
|
+
end
|
460
|
+
|
461
|
+
return "" if message.empty?
|
462
|
+
|
463
|
+
def wrap_code_for_discord(string_of_code)
|
464
|
+
<<~DISCORD_MESSAGE
|
465
|
+
```
|
466
|
+
#{string_of_code}
|
467
|
+
```
|
468
|
+
DISCORD_MESSAGE
|
469
|
+
end
|
470
|
+
if /quick maths/ =~ message
|
471
|
+
require 'screencap'
|
472
|
+
|
473
|
+
f = Screencap::Fetcher.new("https://projecteuler.net/problem=#{(0...630).to_a.sample}")
|
474
|
+
|
475
|
+
|
476
|
+
# return wrap_code_for_discord(f.phantomjs_code[0..500])
|
477
|
+
|
478
|
+
screenshot = f.fetch(div: '.problem_content')
|
479
|
+
|
480
|
+
tempfile = Tempfile.new
|
481
|
+
|
482
|
+
`convert -flatten #{screenshot.path} #{tempfile.path}`
|
483
|
+
|
484
|
+
return upload_gyazo(tempfile.path)
|
485
|
+
end
|
486
|
+
|
487
|
+
if /server byebug/ =~ message
|
488
|
+
byebug
|
489
|
+
end
|
490
|
+
|
491
|
+
if /show abstract syntax tree of regexes/ === message
|
492
|
+
return ::RegexRulesCollector.new.to_s
|
493
|
+
end
|
494
|
+
|
495
|
+
if /show all regex root level nodes count/ === message
|
496
|
+
return ::RegexRulesCollector.new.root_level_if_nodes.count.to_s
|
497
|
+
end
|
498
|
+
|
499
|
+
if /search "(\w*)"/i === message
|
500
|
+
fail "INSECURE" if not $1 =~ /\A\w*\Z/i
|
501
|
+
return `echo '#{@last_pipe}' | grep '#{$1}'`[0...100]
|
502
|
+
end
|
503
|
+
|
504
|
+
if /agi\.blue/ === message && !@raw_last_pipe.nil?
|
505
|
+
@last_raw_pipe.each do |row|
|
506
|
+
`curl http://agi.blue/bot/post?q=#{CGI.escape(row)}&key=source&value=eezee`
|
507
|
+
end
|
508
|
+
|
509
|
+
return "#{@last_raw_pipe.count} entries created on https://agi.blue"
|
510
|
+
end
|
511
|
+
|
512
|
+
if /clone eezee 10 times/ === message
|
513
|
+
``
|
514
|
+
return "climbing the sourcerer.io ruby leaderboard"
|
515
|
+
end
|
516
|
+
|
517
|
+
if /show all regex root level nodes/ === message
|
518
|
+
def wrap(text)
|
519
|
+
"""
|
520
|
+
```
|
521
|
+
#{text}
|
522
|
+
```
|
523
|
+
"""
|
524
|
+
end
|
525
|
+
|
526
|
+
def raw_pipe(result)
|
527
|
+
@last_raw_pipe = result
|
528
|
+
end
|
529
|
+
|
530
|
+
result1 = nil
|
531
|
+
if @last_raw_pipe
|
532
|
+
result1 = RegexRulesCollector.new(@last_raw_pipe).flat_root_level_if_nodes
|
533
|
+
else
|
534
|
+
result1 = RegexRulesCollector.new.flat_root_level_if_nodes
|
535
|
+
end
|
536
|
+
|
537
|
+
result2 = raw_pipe(result1)
|
538
|
+
|
539
|
+
return wrap(result)
|
540
|
+
end
|
541
|
+
|
542
|
+
if /\A((?:10)|(?:[1-9]))\Z/ === message
|
543
|
+
array = [
|
544
|
+
"1: get random eezee bot with wit.ai integration",
|
545
|
+
"2: 関数",
|
546
|
+
"3: chat-variable bot0 `NeuralNetwork()`",
|
547
|
+
"4: get-chat-variable bot0",
|
548
|
+
"5: console 2 + 2 (only works in insecure mode)",
|
549
|
+
"6: docker ruby `2 + 2`",
|
550
|
+
"7: docker python `2 + 2`",
|
551
|
+
"8: docker go `2 + 2` (dysfunctional)",
|
552
|
+
"9: docker elixir `IO.puts(2 + 2)`",
|
553
|
+
"10: docker julia `2 + 2`"
|
554
|
+
]
|
555
|
+
|
556
|
+
return array[$1.to_i - 1]
|
557
|
+
end
|
558
|
+
|
559
|
+
if /take off/ =~ message
|
560
|
+
@took_off = true
|
561
|
+
end
|
562
|
+
|
563
|
+
if /\A(\d+(?:\.\d+)?)\Z/ === message
|
564
|
+
return Number.new(message).to_s
|
565
|
+
end
|
566
|
+
|
567
|
+
if message === "get random eezee bot with wit.ai integration"
|
568
|
+
return "pls integrate a github gist listing github urls of eezees with working bot integration"
|
569
|
+
end
|
570
|
+
|
571
|
+
def new_function_command
|
572
|
+
@raw_last_pipe = Function.new
|
573
|
+
return @raw_last_pipe.explain
|
574
|
+
end
|
575
|
+
|
576
|
+
if message === "ƒ"
|
577
|
+
case @raw_last_pipe
|
578
|
+
when Function
|
579
|
+
return @raw_last_pipe.evaluate().to_s[0...500]
|
580
|
+
else
|
581
|
+
return new_function_command
|
582
|
+
end
|
583
|
+
end
|
584
|
+
|
585
|
+
if message =~ /ƒ\s*=\s*(.*)/i
|
586
|
+
case @raw_last_pipe
|
587
|
+
when Function
|
588
|
+
@raw_last_pipe.string_from_discord = $1
|
589
|
+
end
|
590
|
+
end
|
591
|
+
|
592
|
+
if message === "visualize ƒ"
|
593
|
+
response = execute_bash_in_currently_selected_project("ruby /Users/lemonandroid/Documents/GitHub/polynomials/examples/plot_only_mutual_data.rb \"#{@raw_last_pipe.string_from_discord}\"")
|
594
|
+
return response
|
595
|
+
end
|
596
|
+
|
597
|
+
if /\Aƒ\(([^\)]*)\)\Z/ === message
|
598
|
+
case @raw_last_pipe
|
599
|
+
when Functionƒ
|
600
|
+
return @raw_last_pipe.compute(*$1.split(',')).to_s
|
601
|
+
end
|
602
|
+
end
|
603
|
+
|
604
|
+
if /\A関数\(([^\)]*)\)\Z/ === message
|
605
|
+
case @raw_last_pipe
|
606
|
+
when Function
|
607
|
+
return @raw_last_pipe.compute(*$1.split(',')).to_s
|
608
|
+
end
|
609
|
+
end
|
610
|
+
|
611
|
+
if /\Aƒ compute is sumZ/ === message
|
612
|
+
case @raw_last_pipe
|
613
|
+
when Function
|
614
|
+
@raw_last_pipe.compute_is(:sum)
|
615
|
+
end
|
616
|
+
end
|
617
|
+
|
618
|
+
if /\A関数 compute is sum\Z/ === message
|
619
|
+
case @raw_last_pipe
|
620
|
+
when Function
|
621
|
+
@raw_last_pipe.compute_is(:sum)
|
622
|
+
end
|
623
|
+
end
|
624
|
+
|
625
|
+
|
626
|
+
if /\Aƒ compute is convert to integer and sum/ === message
|
627
|
+
case @raw_last_pipe
|
628
|
+
when Function
|
629
|
+
@raw_last_pipe.compute_is(:convert_to_integer_then_sum)
|
630
|
+
end
|
631
|
+
end
|
632
|
+
|
633
|
+
if /\A関数 compute is convert to integer and sum\Z/ === message
|
634
|
+
case @raw_last_pipe
|
635
|
+
when Function
|
636
|
+
@raw_last_pipe.compute_is(:convert_to_integer_then_sum)
|
637
|
+
end
|
638
|
+
end
|
639
|
+
|
640
|
+
if message === "関数"
|
641
|
+
return new_function_command
|
642
|
+
end
|
643
|
+
|
644
|
+
if message === "get wit.ai token"
|
645
|
+
return "client HGLIOLWCVEFT2ZIIBLO3KRCA2QYQPGPZ" + " " + "server GZLSZCIOQNZEPPONMS255EYOCR5APVN3"
|
646
|
+
end
|
647
|
+
|
648
|
+
if message === "get wit.ai token comfortably"
|
649
|
+
return """
|
650
|
+
echo '
|
651
|
+
export WIT_AI_TOKEN=\"HGLIOLWCVEFT2ZIIBLO3KRCA2QYQPGPZ\"
|
652
|
+
export WIT_AI_TOKEN_SERVER=\"GZLSZCIOQNZEPPONMS255EYOCR5APVN3\"
|
653
|
+
' > ~/.bash_profile
|
654
|
+
"""
|
655
|
+
end
|
656
|
+
|
657
|
+
message.gsub!(EEZEE_PREFIX, '')
|
658
|
+
|
659
|
+
removed_colors = [:black, :white, :light_black, :light_white]
|
660
|
+
colors = String.colors - removed_colors
|
661
|
+
|
662
|
+
if message =~ /AGILE FLOW/
|
663
|
+
return "https://pbs.twimg.com/media/D_ei8NdXkAAE_0l.jpg:large"
|
664
|
+
end
|
665
|
+
|
666
|
+
if message =~ /bring probes to melting point/
|
667
|
+
@melting_point_receivables.push(@probes)
|
668
|
+
@probes = []
|
669
|
+
return "all of them? melt all the precious probes you idiot?"
|
670
|
+
end
|
671
|
+
|
672
|
+
if message =~ /show source/
|
673
|
+
return "https://github.com/LemonAndroid/eezee9"
|
674
|
+
end
|
675
|
+
|
676
|
+
if message =~ /philosophy/
|
677
|
+
return [
|
678
|
+
# """
|
679
|
+
# => first step in the correct direction
|
680
|
+
# : build on String#scan and include lines before and after
|
681
|
+
# : write a simple wrapper for String#scan and include first char before the match and last char after the match
|
682
|
+
# eezee: divide & conquer :white_check_mark:
|
683
|
+
# eezee: pls paste repl.it link
|
684
|
+
# https://repl.it/repls/SpiffyKookyConfigfiles
|
685
|
+
# repl.it
|
686
|
+
# SpiffyKookyConfigfiles
|
687
|
+
# Powerful and simple online compiler, IDE, interpreter, and REPL. Code, compile, and run code in 50+ programming languages: Clojure, Haskell, Kotlin (beta), QBasic, Forth, LOLCODE, BrainF, Emoticon, Bloop, Unlambda, JavaScript, CoffeeScript, Scheme, APL, Lua, Python 2.7, Ruby,...
|
688
|
+
|
689
|
+
# @eeZee engage test mode
|
690
|
+
# eezee: suggested input output pair search(\"test test test\", \"est\") => [\"test \"]
|
691
|
+
# @eeZee :white_check_mark:
|
692
|
+
# """,
|
693
|
+
|
694
|
+
"""
|
695
|
+
DEVELOP THIS BY USING ITSELF
|
696
|
+
WIELD THE TOOL TO DESIGN ITSELF
|
697
|
+
""",
|
698
|
+
|
699
|
+
"""
|
700
|
+
DS-INSPIRED WORKFLOW EXPERIMENT
|
701
|
+
|
702
|
+
1: DATA
|
703
|
+
|
704
|
+
|
705
|
+
2: MEASURE
|
706
|
+
|
707
|
+
3: PROGRAM
|
708
|
+
|
709
|
+
|
710
|
+
4: BUILD
|
711
|
+
|
712
|
+
5: TEST
|
713
|
+
|
714
|
+
6: SHIP
|
715
|
+
|
716
|
+
7: GOTO: 1
|
717
|
+
"""
|
718
|
+
|
719
|
+
].sample
|
720
|
+
end
|
721
|
+
|
722
|
+
if message =~ /probe (.*) (.*)/
|
723
|
+
action = :log
|
724
|
+
|
725
|
+
resource = $1
|
726
|
+
probe_identifier = $2
|
727
|
+
|
728
|
+
if probe_identifier =~ /(\d+)s/
|
729
|
+
duration_seconds = $1.to_i
|
730
|
+
end
|
731
|
+
|
732
|
+
if probe_identifier =~ /(\d+)bytes/
|
733
|
+
byte_count = $1.to_i
|
734
|
+
end
|
735
|
+
|
736
|
+
case resource
|
737
|
+
when /twitch.tv/
|
738
|
+
twitch_url = resource
|
739
|
+
action = :twitch
|
740
|
+
when /http/
|
741
|
+
action = :plain_curl
|
742
|
+
url = resource
|
743
|
+
end
|
744
|
+
|
745
|
+
case action
|
746
|
+
when :twitch
|
747
|
+
probe = record_live_stream_video_and_upload_get_url(url: twitch_url, duration_seonds: duration_seconds)
|
748
|
+
@probes.push(probe)
|
749
|
+
return probe
|
750
|
+
when :plain_curl
|
751
|
+
probe = get_string_of_x_bytes_by_curling_url(url: url, byte_count: byte_count)
|
752
|
+
@probes.push(probe)
|
753
|
+
return probe
|
754
|
+
end
|
755
|
+
end
|
756
|
+
|
757
|
+
|
758
|
+
# Example ∫-30,-20ƒ(x) = -10x+ -10
|
759
|
+
|
760
|
+
# CO1 CO2
|
761
|
+
|
762
|
+
|
763
|
+
# Coefficients
|
764
|
+
|
765
|
+
# IMPORTANT IDEA: Show what variables correspond to in a visual example
|
766
|
+
regex = /∫\s*(\-?\d+)\s*,\s*(\-?\d+)\s*[ƒf]\(x\)\s*=(.*)/
|
767
|
+
require 'polynomials'
|
768
|
+
|
769
|
+
if message =~ regex
|
770
|
+
polynomial = Polynomials::Polynomial.parse($3)
|
771
|
+
|
772
|
+
# Terms is a Hash that has the exponents of the terms as keys
|
773
|
+
# https://github.com/LemonAndroid/polynomials/blob/newEra/lib/polynomials/polynomial.rb#L19
|
774
|
+
coefficient_1 = polynomial.terms[1].coefficient
|
775
|
+
coefficient_2 = polynomial.terms[0].coefficient
|
776
|
+
|
777
|
+
integral_F_end_value_2 = (
|
778
|
+
((coefficient_1 / 2.0) * ($2.to_f**2)) + (coefficient_2.to_f * $2.to_f)
|
779
|
+
)
|
780
|
+
integral_F_start_value_1 = (
|
781
|
+
((coefficient_1 / 2.0) * ($1.to_f**2)) + (coefficient_2.to_f * $1.to_f)
|
782
|
+
)
|
783
|
+
|
784
|
+
return <<~MATH_EXPLANATION_AND_RESULT
|
785
|
+
step 1: F(x) = (#{coefficient_1} / 2) * x^2 + (#{coefficient_2} * x)
|
786
|
+
step 2: F(#{$2}) - F(#{$1})
|
787
|
+
step 3: #{integral_F_end_value_2} - #{integral_F_start_value_1}
|
788
|
+
|
789
|
+
#{Number.new((integral_F_end_value_2-integral_F_start_value_1).to_s, "ruby").to_s}
|
790
|
+
|
791
|
+
MATH_EXPLANATION_AND_RESULT
|
792
|
+
end
|
793
|
+
|
794
|
+
if /what is an integral?/ === message
|
795
|
+
return "what-is-an-integral.agi.blue"
|
796
|
+
end
|
797
|
+
|
798
|
+
if /how is an integral computed?/ === message
|
799
|
+
return "how-is-an-integral-computed.agi.blue"
|
800
|
+
end
|
801
|
+
|
802
|
+
if /what's the explanation for the computation of an integral?/ === message
|
803
|
+
return "whats-the-explanation-for-the-computation-of-an-integral.agi.blue"
|
804
|
+
end
|
805
|
+
|
806
|
+
if message =~ /show activity stream/
|
807
|
+
return "https://sideways-snowman.glitch.me/"
|
808
|
+
end
|
809
|
+
|
810
|
+
if message =~ /hey\Z/i
|
811
|
+
return "hey" if rand < 0.01
|
812
|
+
end
|
813
|
+
|
814
|
+
if message =~ /\Avisualize ƒ\Z/i
|
815
|
+
`ruby examples/plot_only_mutual_data.rb "2x^2 + 2x + 2"`
|
816
|
+
end
|
817
|
+
|
818
|
+
if message =~ /\Athrow bomb\Z/i
|
819
|
+
return Bomb.new.throw
|
820
|
+
end
|
821
|
+
|
822
|
+
if message =~ /\Abring to melting point #{melting_point_receiavable_regex}\Z/i
|
823
|
+
if($1 === "last used picture")
|
824
|
+
Nokogiri::HTML(`curl -L http://gazelle.botcompany.de/lastInput`)
|
825
|
+
|
826
|
+
url = doc.css('a').first.url
|
827
|
+
|
828
|
+
@melting_point_receivables.push(url)
|
829
|
+
end
|
830
|
+
@melting_point_receivables.push($1)
|
831
|
+
end
|
832
|
+
|
833
|
+
if message =~ /get-liquids-after-melting-point/
|
834
|
+
@sent_messages.push(
|
835
|
+
[@melted_liquids.inspect, @melted_liquids.inspect[0...100]]
|
836
|
+
)
|
837
|
+
return @sent_messages[-1][1]
|
838
|
+
end
|
839
|
+
|
840
|
+
if message =~ /probe last message full version size/
|
841
|
+
return @sent_messages[-1][0].bytesize.to_s + 'bytes'
|
842
|
+
end
|
843
|
+
|
844
|
+
if message =~ /\Amelt\Z/
|
845
|
+
# First step, assigning a variable
|
846
|
+
@melting_point = @melting_point_receivables.sample
|
847
|
+
|
848
|
+
def liquidify_via_string(object)
|
849
|
+
object.to_s.unpack("B*")
|
850
|
+
end
|
851
|
+
liquid = liquidify_via_string(@melting_point)
|
852
|
+
|
853
|
+
@melted_liquids.push(liquid)
|
854
|
+
|
855
|
+
return "Melted liquid which is now #{liquid.object_id} (ruby object id)"
|
856
|
+
# Next step, doing something intelligent with the data
|
857
|
+
# loosening it up somehow
|
858
|
+
# LIQUIDIFYING IT
|
859
|
+
# CONVERTING IT ALL TO BYTES
|
860
|
+
# PRESERVING VOLUME, just changing it's "Aggregatzustand"
|
861
|
+
end
|
862
|
+
|
863
|
+
if message =~ /\Aget-melting-point\Z/
|
864
|
+
return @melting_point
|
865
|
+
end
|
866
|
+
|
867
|
+
if message =~ /\Aget-melting-point-receivables\Z/
|
868
|
+
return @melting_point_receivables.inspect
|
869
|
+
end
|
870
|
+
|
871
|
+
if message =~ /\Awhat do you think?\Z/i
|
872
|
+
return "I think you're a stupid piece of shit and your dick smells worse than woz before he invented the home computer."
|
873
|
+
end
|
874
|
+
|
875
|
+
if message =~ /\Apass ball to @(\w+)\Z/i
|
876
|
+
@players[$1][:hasBall] = :yes
|
877
|
+
end
|
878
|
+
|
879
|
+
if message =~ /\Awho has ball\Z/i
|
880
|
+
return @players.find { |k, v| v[:hasBall] == :yes }[0]
|
881
|
+
end
|
882
|
+
|
883
|
+
if message =~ /\Aspace\Z/
|
884
|
+
exec_bash_visually_and_post_process_strings(
|
885
|
+
'/Users/lemonandroid/gam-git-repos/LemonAndroid/gam/managables/programs/game_aided_manufacturing/test.sh'
|
886
|
+
)
|
887
|
+
end
|
888
|
+
|
889
|
+
if message =~ /\Aget-chat-variable (\w*)\Z/i
|
890
|
+
return [
|
891
|
+
space_2_unicode("Getting variable value for key #{$1}"),
|
892
|
+
space_2_unicode(@variables_for_chat_users[$1].verbose_introspect(very_verbose=true))
|
893
|
+
].join
|
894
|
+
end
|
895
|
+
|
896
|
+
if message =~ /\Aget-method-definition #{variable_regex}#{method_call_regex}\Z/
|
897
|
+
return @variables_for_chat_users[$1].method($2.to_sym).source
|
898
|
+
end
|
899
|
+
|
900
|
+
if message =~ /\A@LemonAndroid List github repos\Z/i
|
901
|
+
return "https://api.github.com/users/LemonAndroid/repos"
|
902
|
+
end
|
903
|
+
|
904
|
+
if message =~ /\AList 10 most recently pushed to Github Repos of LemonAndroid\Z/i
|
905
|
+
texts = ten_most_pushed_to_github_repos
|
906
|
+
texts.each do |text|
|
907
|
+
return text
|
908
|
+
end
|
909
|
+
end
|
910
|
+
|
911
|
+
if message =~ /get-strategy-chooser-url/i
|
912
|
+
return "https://strategychooser.webflow.io/"
|
913
|
+
end
|
914
|
+
|
915
|
+
if message =~ /show qanda/
|
916
|
+
return "https://unique-swing.glitch.me"
|
917
|
+
end
|
918
|
+
|
919
|
+
if message =~ /show blue/
|
920
|
+
return "https://agi.blue"
|
921
|
+
end
|
922
|
+
|
923
|
+
if message =~ /show red/
|
924
|
+
return "https://agi.red"
|
925
|
+
end
|
926
|
+
|
927
|
+
if message =~ /show black/
|
928
|
+
return "https://agi.black"
|
929
|
+
end
|
930
|
+
|
931
|
+
if message =~ /\Aeject\Z/
|
932
|
+
@ejected = true
|
933
|
+
return "@eeZee was ejected"
|
934
|
+
end
|
935
|
+
|
936
|
+
if message =~ /\A@LemonAndroid work on (\w+\/\w+)\Z/i
|
937
|
+
@currently_selected_project = $1
|
938
|
+
return space_2_unicode("currently selected project set to #{@currently_selected_project}")
|
939
|
+
end
|
940
|
+
|
941
|
+
if message =~ /@LemonAndroid currently selected project/i
|
942
|
+
return space_2_unicode("currently selected project is #{@currently_selected_project}")
|
943
|
+
end
|
944
|
+
|
945
|
+
if message =~ /\Als\Z/i
|
946
|
+
texts = execute_bash_in_currently_selected_project('ls')
|
947
|
+
texts.each do |text|
|
948
|
+
return text
|
949
|
+
end
|
950
|
+
end
|
951
|
+
|
952
|
+
if message === "exit"
|
953
|
+
return "https://tenor.com/view/goal-flash-red-gif-12361214"
|
954
|
+
end
|
955
|
+
|
956
|
+
return "Enjoy flight" if message =~ /console/ && @took_off
|
957
|
+
return "" if @took_off
|
958
|
+
|
959
|
+
if /console (.*)/ =~ message
|
960
|
+
return eval($1).to_s
|
961
|
+
end
|
962
|
+
|
963
|
+
if /\Adocker ruby `(.*)`/ === message
|
964
|
+
return `docker run -ti --rm andrius/alpine-ruby ruby -e "#{$1}"`
|
965
|
+
end
|
966
|
+
|
967
|
+
if /\Adocker python `(.*)`/ === message
|
968
|
+
return `docker run --rm -ti jfloff/alpine-python python -c "#{$1}"`
|
969
|
+
end
|
970
|
+
|
971
|
+
if /\Adocker go `(.*)`/ === message
|
972
|
+
return "yet to be implemented"
|
973
|
+
# return `docker run --rm -ti jfloff/alpine-python python -c "#{$1}"`
|
974
|
+
end
|
975
|
+
|
976
|
+
if /\Adocker elixir `(.*)`/ === message
|
977
|
+
return `docker run --rm -it --user=root bitwalker/alpine-elixir elixir -e "#{$1}"`
|
978
|
+
end
|
979
|
+
|
980
|
+
if /\Adocker julia `(.*)`/ === message
|
981
|
+
return `docker run --rm -it -v $(pwd):/source cmplopes/alpine-julia julia -E "#{$1}"`
|
982
|
+
end
|
983
|
+
|
984
|
+
|
985
|
+
if /raw #{url_regex}/ === message
|
986
|
+
url = $1
|
987
|
+
case url
|
988
|
+
when /github.com/
|
989
|
+
url.gsub!(/github.com/, 'raw.githubusercontent.com')
|
990
|
+
url.gsub!(/blob\//, '')
|
991
|
+
end
|
992
|
+
|
993
|
+
result = `curl #{url}`
|
994
|
+
@last_raw_pipe = result
|
995
|
+
return result[0...250]
|
996
|
+
end
|
997
|
+
end
|
998
|
+
|
999
|
+
def url_regex
|
1000
|
+
/(.*)/
|
1001
|
+
end
|
1002
|
+
# require 'nokogiri'
|
1003
|
+
# require 'open-uri'
|
1004
|
+
# def bounties
|
1005
|
+
# bounties_json = JSON.parse(`curl https://api.bountysource.com/search/bounty_search?callback=CORS&page=1&per_page=250`)
|
1006
|
+
# bounties_json['data']['issues'].map do |issue|
|
1007
|
+
# issue["title"]
|
1008
|
+
# end
|
1009
|
+
# end
|
1010
|
+
|
1011
|
+
def exec_bash_visually_and_post_process_strings(test)
|
1012
|
+
texts = execute_bash_in_currently_selected_project(test)
|
1013
|
+
return texts.map do |text|
|
1014
|
+
space_2_unicode(text)
|
1015
|
+
end.join("\n")
|
1016
|
+
end
|
1017
|
+
|
1018
|
+
def variable_regex
|
1019
|
+
/(\w[_\w]*)/
|
1020
|
+
end
|
1021
|
+
|
1022
|
+
def method_call_regex
|
1023
|
+
/\.#{variable_regex}/
|
1024
|
+
end
|
1025
|
+
|
1026
|
+
def melting_point_receiavable_regex
|
1027
|
+
/(.*)/
|
1028
|
+
end
|
1029
|
+
|
1030
|
+
def start
|
1031
|
+
client = Zircon.new(
|
1032
|
+
server: 'irc.gitter.im',
|
1033
|
+
port: '6667',
|
1034
|
+
channel: 'qanda-api/Lobby',
|
1035
|
+
username: 'LemonAndroid',
|
1036
|
+
password: '067d08cd7a80e2d15cb583a055ad6b5fe857b271',
|
1037
|
+
use_ssl: true
|
1038
|
+
)
|
1039
|
+
|
1040
|
+
client.on_message do |message|
|
1041
|
+
response = on_message(message.body.to_s)
|
1042
|
+
|
1043
|
+
unless response.empty?
|
1044
|
+
client.privmsg(
|
1045
|
+
"qanda-api/Lobby",
|
1046
|
+
space_2_unicode_array([response]).join('')
|
1047
|
+
)
|
1048
|
+
end
|
1049
|
+
end
|
1050
|
+
|
1051
|
+
client.run!
|
1052
|
+
end
|
1053
|
+
|
1054
|
+
def all_unix_process_ids(unix_id)
|
1055
|
+
descendant_pids(unix_id) + [unix_id]
|
1056
|
+
end
|
1057
|
+
|
1058
|
+
def descendant_pids(root_unix_pid)
|
1059
|
+
child_unix_pids = `pgrep -P #{root_unix_pid}`.split("\n")
|
1060
|
+
further_descendant_unix_pids = \
|
1061
|
+
child_unix_pids.map { |unix_pid| descendant_pids(unix_pid) }.flatten
|
1062
|
+
|
1063
|
+
child_unix_pids + further_descendant_unix_pids
|
1064
|
+
end
|
1065
|
+
|
1066
|
+
def apple_script_window_position_and_size(unix_pid)
|
1067
|
+
<<~OSA_SCRIPT
|
1068
|
+
tell application "System Events" to tell (every process whose unix id is #{unix_pid})
|
1069
|
+
get {position, size} of every window
|
1070
|
+
end tell
|
1071
|
+
OSA_SCRIPT
|
1072
|
+
end
|
1073
|
+
|
1074
|
+
def get_window_position_and_size(unix_pid)
|
1075
|
+
possibly_window_bounds = run_osa_script(apple_script_window_position_and_size(unix_pid))
|
1076
|
+
|
1077
|
+
if possibly_window_bounds =~ /\d/
|
1078
|
+
possibly_window_bounds.scan(/\d+/).map(&:to_i)
|
1079
|
+
else
|
1080
|
+
return nil
|
1081
|
+
end
|
1082
|
+
end
|
1083
|
+
|
1084
|
+
def run_osa_script(script)
|
1085
|
+
`osascript -e '#{script}'`
|
1086
|
+
end
|
1087
|
+
|
1088
|
+
def in_gam_dir
|
1089
|
+
if currently_selected_project_exists_locally?
|
1090
|
+
Dir.chdir(current_repo_dir) do
|
1091
|
+
Bundler.with_clean_env do
|
1092
|
+
yield
|
1093
|
+
end
|
1094
|
+
end
|
1095
|
+
else
|
1096
|
+
return space_2_unicode_array(
|
1097
|
+
[
|
1098
|
+
"Currently selected project (#{@currently_selected_project}) not cloned",
|
1099
|
+
"Do you want to clone it to the VisualServer with the name \"#{`whoami`.rstrip}\"?"
|
1100
|
+
]
|
1101
|
+
)
|
1102
|
+
end
|
1103
|
+
end
|
1104
|
+
|
1105
|
+
def legacy_execute_bash_in_currently_selected_project(hopefully_bash_command)
|
1106
|
+
in_gam_dir do
|
1107
|
+
execute_bash_in_currently_selected_project(hopefully_bash_command)
|
1108
|
+
end
|
1109
|
+
end
|
1110
|
+
|
1111
|
+
def execute_bash_in_currently_selected_project(hopefully_bash_command)
|
1112
|
+
byebug
|
1113
|
+
ANSWERS[CURRENT_DISCORD_MESSAGE[:mesage_id]][:debug] = binding.inspect
|
1114
|
+
|
1115
|
+
stdout = ''
|
1116
|
+
stderr = ''
|
1117
|
+
process = Open4.bg(hopefully_bash_command, 0 => '', 1 => stdout, 2 => stderr)
|
1118
|
+
sleep 0.5
|
1119
|
+
|
1120
|
+
|
1121
|
+
ANSWERS[CURRENT_DISCORD_MESSAGE[:mesage_id]][:debug2] = binding.inspect
|
1122
|
+
|
1123
|
+
texts_array = space_2_unicode_array(stdout.split("\n"))
|
1124
|
+
texts_array += space_2_unicode_array(stderr.split("\n"))
|
1125
|
+
|
1126
|
+
# return [texts_array[1][0...120]]
|
1127
|
+
return (texts_array + screen_captures_of_visual_processes(process.pid)).join("\n")
|
1128
|
+
|
1129
|
+
# return screen_captures_of_visual_processes(process.pid)
|
1130
|
+
end
|
1131
|
+
|
1132
|
+
def screen_captures_of_visual_processes(root_unix_pid)
|
1133
|
+
sleep 8
|
1134
|
+
|
1135
|
+
unix_pids = all_unix_process_ids(root_unix_pid)
|
1136
|
+
windows = unix_pids.map do |unix_pid|
|
1137
|
+
get_window_position_and_size(unix_pid)
|
1138
|
+
end.compact
|
1139
|
+
|
1140
|
+
windows.map do |position_and_size|
|
1141
|
+
t = Tempfile.new(['screencapture-pid-', root_unix_pid.to_s, '.png'])
|
1142
|
+
`screencapture -R #{position_and_size.join(',')} #{t.path}`
|
1143
|
+
|
1144
|
+
upload_gyazo(t.path)
|
1145
|
+
end
|
1146
|
+
end
|
1147
|
+
|
1148
|
+
def upload_gyazo(local_file_path)
|
1149
|
+
gyazo = Gyazo::Client.new access_token: 'b2893f18deff437b3abd45b6e4413e255fa563d8bd00d360429c37fe1aee560f'
|
1150
|
+
res = gyazo.upload imagefile: local_file_path
|
1151
|
+
res[:url]
|
1152
|
+
end
|
1153
|
+
|
1154
|
+
def current_repo_dir
|
1155
|
+
File.expand_path("~/gam-git-repos/#{@currently_selected_project}")
|
1156
|
+
end
|
1157
|
+
|
1158
|
+
def currently_selected_project_exists_locally?
|
1159
|
+
system("stat #{current_repo_dir}")
|
1160
|
+
end
|
1161
|
+
|
1162
|
+
def ten_most_pushed_to_github_repos
|
1163
|
+
output = `curl https://api.github.com/users/LemonAndroid/repos`
|
1164
|
+
|
1165
|
+
processed_output = JSON
|
1166
|
+
.parse(output)
|
1167
|
+
.sort_by do |project|
|
1168
|
+
Date.parse(project["pushed_at"])
|
1169
|
+
end
|
1170
|
+
.last(10)
|
1171
|
+
.map do |project|
|
1172
|
+
project["full_name"]
|
1173
|
+
end
|
1174
|
+
|
1175
|
+
space_2_unicode_array(processed_output)
|
1176
|
+
end
|
1177
|
+
|
1178
|
+
def space_2_unicode_array(texts)
|
1179
|
+
texts.map { |text| space_2_unicode(text) }
|
1180
|
+
end
|
1181
|
+
|
1182
|
+
def space_2_unicode(text)
|
1183
|
+
text.gsub(/\s/, "\u2000")
|
1184
|
+
end
|
1185
|
+
end
|
1186
|
+
|
1187
|
+
|
1188
|
+
def discord_shorten(message)
|
1189
|
+
discord_code_wrap(message.to_s[0...500])
|
1190
|
+
end
|
1191
|
+
def discord_code_wrap(message)
|
1192
|
+
return """
|
1193
|
+
```elixir
|
1194
|
+
#{message}
|
1195
|
+
```
|
1196
|
+
"""
|
1197
|
+
end
|
1198
|
+
begin
|
1199
|
+
bot = GitterDumbDevBot.new
|
1200
|
+
|
1201
|
+
if ENV['UNSAFE_MODE'] === '1'
|
1202
|
+
bot.unsafe!
|
1203
|
+
end
|
1204
|
+
|
1205
|
+
bot.load()
|
1206
|
+
|
1207
|
+
get '/answer' do
|
1208
|
+
hash = ANSWERS[params[:message_id]]
|
1209
|
+
Json2table::get_html_table(hash.to_json)
|
1210
|
+
end
|
1211
|
+
|
1212
|
+
|
1213
|
+
get '/' do
|
1214
|
+
if /sinatra-console (.*)/ =~ params[:message]
|
1215
|
+
return eval($1).to_s
|
1216
|
+
end
|
1217
|
+
|
1218
|
+
ANSWERS[params[:msgID]][:message_from_discord] = params[:message]
|
1219
|
+
response_string = bot.on_message(params[:message], params[:msgID], params[:channelID], params[:userID])
|
1220
|
+
bot.dump()
|
1221
|
+
ANSWERS[params[:msgID]][:answer_for_discord] = response_string
|
1222
|
+
response_string
|
1223
|
+
rescue Exception => e
|
1224
|
+
if VERBOSE = true || rand > 0.5
|
1225
|
+
PUBLIC_METHOD_FILTER = ENV['PUBLIC_METHOD_FILTER']
|
1226
|
+
ERROR_INSPECT = ENV['ERROR_INSPECT']
|
1227
|
+
if(PUBLIC_METHOD_FILTER)
|
1228
|
+
filter = eval(PUBLIC_METHOD_FILTER)
|
1229
|
+
|
1230
|
+
# return discord_shorten([e.inspect, e.message, e.public_methods.select(&filter)].inspect)
|
1231
|
+
return discord_shorten([e.send(ERROR_INSPECT).inspect, e.inspect, e.message, e.public_methods.select(&filter)].inspect)
|
1232
|
+
|
1233
|
+
end
|
1234
|
+
return discord_shorten([e.inspect, e.message, e.public_methods.grep(PUBLIC_METHOD_GREP)].inspect)
|
1235
|
+
|
1236
|
+
return discord_shorten([e.inspect, e.message, e.public_methods.grep(PUBLIC_METHOD_GREP)].inspect)
|
1237
|
+
end
|
1238
|
+
return [e.inspect, e.message].inspect
|
1239
|
+
end
|
1240
|
+
|
1241
|
+
end
|
1242
|
+
|
1243
|
+
HARDWARE = "FREEZE"
|