ezii 0.0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +5 -5
  2. data/eezee-3-aka-game-x-engine.zip +0 -0
  3. data/eezee-3-aka-game-x-engine/README.md +5 -0
  4. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/functions/base_command.rb +20 -0
  5. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/functions/mouse_y_axis_to_3d_z_axis.rb +4 -0
  6. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/functions/rotate_camera_axis_using_mouse_drag.rb +37 -0
  7. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/functions/selection_cube.rb +35 -0
  8. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/gam.rb +467 -0
  9. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/gems.locked +77 -0
  10. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/gems.rb +10 -0
  11. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/lib/drb_server.rb +13 -0
  12. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/lib/mittsu_monkeypatches/box_geometry.rb +5 -0
  13. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/runnable.rb +9 -0
  14. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/shapes/cube.rb +33 -0
  15. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/sig/runable.rbi +9 -0
  16. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/test.sh +5 -0
  17. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/test/commands/test_selection_cube.rb +31 -0
  18. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/test/test_command_remapping.rb +30 -0
  19. data/eezee-3-aka-game-x-engine/managables/programs/game_aided_manufacturing/test/test_helper.rb +75 -0
  20. data/eezee-3-aka-game-x-engine/managables/services/chat-bot-integrations/chat.txt +15 -0
  21. data/eezee-3-aka-game-x-engine/managables/services/chat-bot-integrations/chatbot.rb +718 -0
  22. data/eezee-3-aka-game-x-engine/managables/services/chat-bot-integrations/gems.locked +50 -0
  23. data/eezee-3-aka-game-x-engine/managables/services/chat-bot-integrations/gems.rb +13 -0
  24. data/eezee-3-aka-game-x-engine/managables/services/chat-bot-integrations/setup-mac-os-x.sh +0 -0
  25. data/eezee-3-aka-game-x-engine/managables/services/chat-bot-integrations/setup.sh +1 -0
  26. data/eezee-3-aka-game-x-engine/managables/services/chat-bot-integrations/start.sh +3 -0
  27. data/eezee-3-aka-game-x-engine/managables/services/error-inspect/simplest-log +1 -0
  28. data/eezee-3-aka-game-x-engine/managables/services/error-inspect/simplest-log-init +1 -0
  29. data/eezee-3-aka-game-x-engine/managables/services/livestream-interactive/Twitch.Tv/gems.locked +17 -0
  30. data/eezee-3-aka-game-x-engine/managables/services/livestream-interactive/Twitch.Tv/gems.rb +5 -0
  31. data/eezee-3-aka-game-x-engine/managables/services/livestream-interactive/Twitch.Tv/twitch_zircon.rb +112 -0
  32. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/README.md +3 -0
  33. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/__main__.js +58 -0
  34. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/black-out-random-word.js +74 -0
  35. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-sentence.js +57 -0
  36. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-wikipedia-page.js +25 -0
  37. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-words.js +34 -0
  38. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/rare-enough-word.js +41 -0
  39. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/wikipedia-page.js +35 -0
  40. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/package.json +20 -0
  41. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/statistics/count-word.js +12 -0
  42. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/utils/log-to-natural-database.js +10 -0
  43. data/eezee-3-aka-game-x-engine/managables/services/stdlib-dot-com/koma/qanda-api@dev/word2vec-models/test-text8-vector.bin +0 -0
  44. data/eezee-3-aka-game-x-engine/managament_interface/gems.locked +13 -0
  45. data/eezee-3-aka-game-x-engine/managament_interface/gems.rb +3 -0
  46. data/eezee-3-aka-game-x-engine/managament_interface/management_interface +4 -0
  47. data/eezee-3-aka-game-x-engine/managament_interface/runnable.rb +30 -0
  48. data/eezee-3-aka-game-x-engine/start.sh +2 -0
  49. data/ezii.gemspec +1 -1
  50. metadata +49 -3
@@ -0,0 +1,77 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ activesupport (6.0.0)
5
+ concurrent-ruby (~> 1.0, >= 1.0.2)
6
+ i18n (>= 0.7, < 2)
7
+ minitest (~> 5.1)
8
+ tzinfo (~> 1.1)
9
+ zeitwerk (~> 2.1, >= 2.1.8)
10
+ ast (2.4.0)
11
+ ast_utils (0.3.0)
12
+ parser (~> 2.4)
13
+ thor (>= 0.19)
14
+ byebug (11.0.1)
15
+ chunky_png (1.3.11)
16
+ coderay (1.1.2)
17
+ concurrent-ruby (1.1.5)
18
+ ffi (1.11.1)
19
+ i18n (1.6.0)
20
+ concurrent-ruby (~> 1.0)
21
+ language_server-protocol (3.14.0.1)
22
+ listen (3.1.5)
23
+ rb-fsevent (~> 0.9, >= 0.9.4)
24
+ rb-inotify (~> 0.9, >= 0.9.7)
25
+ ruby_dep (~> 1.2)
26
+ method_source (0.9.2)
27
+ mini_portile2 (2.4.0)
28
+ minitest (5.11.3)
29
+ mittsu (0.3.1)
30
+ chunky_png (~> 1.3)
31
+ ffi (~> 1.9)
32
+ opengl-bindings (~> 1.5)
33
+ nokogiri (1.10.4)
34
+ mini_portile2 (~> 2.4.0)
35
+ opengl-bindings (1.6.9)
36
+ os (1.0.1)
37
+ parser (2.6.4.1)
38
+ ast (~> 2.4.0)
39
+ pry (0.12.2)
40
+ coderay (~> 1.1.0)
41
+ method_source (~> 0.9.0)
42
+ pry-remote (0.1.8)
43
+ pry (~> 0.9)
44
+ slop (~> 3.0)
45
+ rainbow (3.0.0)
46
+ rb-fsevent (0.10.3)
47
+ rb-inotify (0.10.0)
48
+ ffi (~> 1.0)
49
+ ruby_dep (1.5.0)
50
+ slop (3.6.0)
51
+ steep (0.11.1)
52
+ activesupport (>= 5.1)
53
+ ast_utils (~> 0.3.0)
54
+ language_server-protocol (~> 3.14.0)
55
+ listen (~> 3.1)
56
+ parser (~> 2.4)
57
+ pry (~> 0.12.2)
58
+ rainbow (>= 2.2.2, < 4.0)
59
+ thor (0.20.3)
60
+ thread_safe (0.3.6)
61
+ tzinfo (1.2.5)
62
+ thread_safe (~> 0.1)
63
+ zeitwerk (2.1.10)
64
+
65
+ PLATFORMS
66
+ ruby
67
+
68
+ DEPENDENCIES
69
+ byebug
70
+ mittsu
71
+ nokogiri (>= 1.10.4)
72
+ os
73
+ pry-remote
74
+ steep
75
+
76
+ BUNDLED WITH
77
+ 2.0.2
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'mittsu'
4
+ gem 'steep'
5
+ gem 'os'
6
+
7
+ gem 'byebug'
8
+ gem 'pry-remote'
9
+
10
+ gem "nokogiri", ">= 1.10.4"
@@ -0,0 +1,13 @@
1
+ require 'drb/drb'
2
+
3
+ class DrbServer
4
+ URI="druby://localhost:65000"
5
+
6
+ def initialize(front_object)
7
+ @front_object = front_object
8
+ end
9
+
10
+ def start
11
+ DRb.start_service(URI, @front_object)
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ class Mittsu::BoxGeometry
2
+ def volume
3
+ @parameters[:width] * @parameters[:height] * @parameters[:depth]
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'gam'
2
+ require_relative 'lib/drb_server.rb'
3
+
4
+
5
+ gam = Gam.new
6
+
7
+ DrbServer.new(gam).start
8
+
9
+ gam.start
@@ -0,0 +1,33 @@
1
+ require_relative '../lib/mittsu_monkeypatches/box_geometry.rb'
2
+
3
+ class Cube
4
+ attr_accessor :color, :mittsu_object, :size_vector
5
+
6
+ def initialize(color: 0x0000ff, size_vector: Mittsu::Vector3.new(1.0, 1.0, 1.0))
7
+ # value assignment (phase 1)
8
+
9
+ self.color = color
10
+ self.size_vector = size_vector
11
+
12
+ # computing based on values (phase 2)
13
+ self.create_mittsu_object
14
+
15
+ # event distribution (phase 3)
16
+ ::Gam::CUBES.push(self)
17
+ end
18
+
19
+ def create_mittsu_object
20
+ @mittsu_object = Mittsu::Mesh.new(
21
+ Mittsu::BoxGeometry.new(self.size_vector.x, self.size_vector.y, self.size_vector.z),
22
+ Mittsu::MeshBasicMaterial.new(color: self.color)
23
+ )
24
+ end
25
+
26
+ def fall_down
27
+ self.position.y -= 0.01
28
+ end
29
+
30
+ def method_missing(method_name, *args, &block)
31
+ @mittsu_object.public_send(method_name, *args, &block)
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ class Cube
2
+ def initialize: () -> any
3
+ def mittsu_object: () -> any
4
+ def color: () -> Integer
5
+ end
6
+
7
+ SCREEN_WIDTH: Integer
8
+ SCREEN_HEIGHT: Integer
9
+ ASPECT: any
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
4
+ cd $DIR
5
+ bundle exec ruby ./test/commands/test_selection_cube.rb
@@ -0,0 +1,31 @@
1
+ require_relative '../test_helper.rb'
2
+ require 'byebug'
3
+
4
+ module SystemTests
5
+ class TestSelectionCube < AbstractSystemTest
6
+ def test_gets_mouse_down_position
7
+ open_gam_window do |console_stdin, console_stdout|
8
+ drb_interface.execute_command(drb_interface.functions[1])
9
+ drag_mouse_from_to_in_gam_window([100, 100], [150, 150])
10
+ scroll_out_in_gam_window(-10)
11
+ sleep 1
12
+ drb_interface.execute_command(drb_interface.functions[1])
13
+ drag_mouse_from_to_in_gam_window([100, 100], [150, 150])
14
+ sleep 0.5
15
+ @output = get_2_last_created_cubes_volume(drb_interface)
16
+ end
17
+
18
+ assert @output.first < @output.last, "Firstly created cube is smaller"
19
+ end
20
+
21
+ def get_2_last_created_cubes_volume(drb_interface)
22
+ firstly_created_cube = drb_interface.cubes[0]
23
+ secondly_created_cube = drb_interface.cubes[1]
24
+
25
+ firstly_created_cube_volume = firstly_created_cube.geometry.volume
26
+ secondly_created_cube_volume = secondly_created_cube.geometry.volume
27
+
28
+ return [firstly_created_cube_volume, secondly_created_cube_volume]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ require_relative 'test_helper.rb'
2
+ require 'byebug'
3
+
4
+ module SystemTests
5
+ class TestCommandRemapping < AbstractSystemTest
6
+ def test_command_remapping
7
+ open_gam_window do |console_stdin, console_stdout|
8
+ send_keypress_to_gam_window("y")
9
+
10
+ puts console_stdout.gets
11
+ puts console_stdout.gets
12
+ puts console_stdout.gets
13
+
14
+ console_stdin.puts("1")
15
+
16
+ puts console_stdout.gets
17
+
18
+ console_stdin.puts("z")
19
+
20
+ send_keypress_to_gam_window("z")
21
+
22
+ sleep 1
23
+
24
+ @output = drb_interface.played_commands.last.class.name
25
+ end
26
+
27
+ assert_match "SelectionCube", @output
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,75 @@
1
+ require "minitest/autorun"
2
+ require_relative '../gam'
3
+ require_relative '../functions/selection_cube'
4
+ require 'os'
5
+ require 'open3'
6
+ require 'drb/drb'
7
+
8
+
9
+ DRb.start_service
10
+
11
+ module SystemTests
12
+ class AbstractSystemTest < Minitest::Test
13
+ SERVER_URI="druby://localhost:65000"
14
+
15
+ def drb_interface
16
+ @drb_interface ||= DRbObject.new_with_uri(SERVER_URI)
17
+ end
18
+
19
+ def send_keypress_to_gam_window(key)
20
+ apple_script("keystroke \"#{key}\"")
21
+ end
22
+
23
+ def drag_mouse_from_to_in_gam_window(from, to)
24
+ apple_script("set position of window 1 to {0, 0}")
25
+
26
+ cliclick_drag_start(*from)
27
+ cliclick_drag_end(*to)
28
+ end
29
+
30
+ def scroll_out_in_gam_window(factor)
31
+ `cliclick sp:#{factor},0,0`
32
+ end
33
+
34
+ def cliclick_drag_start(x,y)
35
+ `cliclick dd:#{x},#{y}`
36
+ end
37
+
38
+ def cliclick_drag_end(x,y)
39
+ `cliclick du:#{x},#{y}`
40
+ end
41
+
42
+ def apple_script(script)
43
+ if OS.mac?
44
+ `osascript -e 'tell application "System Events" to tell (every process whose unix id is #{@gam_pid})
45
+ set frontmost to true
46
+
47
+ #{script}
48
+ end tell'`
49
+ end
50
+ end
51
+
52
+ def open_gam_window(&block)
53
+ outer_self = self
54
+ Open3.popen3("ruby runnable.rb") do |stdin, stdout, stderr, thread|
55
+ Thread.new {
56
+ open('/var/log/gam.stderr', 'a') { |f|
57
+ begin
58
+ while line = stderr.gets
59
+ f << line
60
+ end
61
+ rescue IOError
62
+ end
63
+ }
64
+ }
65
+
66
+ @gam_pid = thread.pid
67
+ sleep 2
68
+
69
+ outer_self.instance_exec(stdin, stdout, &block)
70
+
71
+ Process.kill('KILL', @gam_pid)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,15 @@
1
+
2
+ Gitter
3
+ Version:
4
+ Created
5
+ irc.gitter.im
6
+ CHANTYPES=#
7
+ - Message of the Day -
8
+ - Welcome To Gitter IRC!
9
+ - Info at https://irc.gitter.im
10
+ - Code at https://gitlab.com/gitlab-org/gitter/irc-bridge
11
+ End of /MOTD command.
12
+
13
+ #qanda-api/Lobby
14
+ *
15
+ #qanda-api/Lobby
@@ -0,0 +1,718 @@
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
+
15
+ # class Object
16
+ # def ===(method, *args, &block)
17
+ # TODO: also alllow Module === object => true if Module::Class === object => true
18
+ # end
19
+ # end
20
+
21
+ def optional_prefix(prefix, message)
22
+ [prefix + message, message]
23
+ end
24
+
25
+ EEZEE_PREFIX = "eezee" + " "
26
+
27
+ ALLOWED_MESSAGES_LIST = [
28
+ "fuck it",
29
+ "install ruby",
30
+ "do something useful",
31
+ "know context?",
32
+ "like do you know context you dum dum?",
33
+ "show `man ruby`",
34
+ "show `man netstat`",
35
+ "show `man telnet`",
36
+ "show `man traceroute`",
37
+ "lifecycle",
38
+ "bleeding",
39
+ "bleeding lifecycle",
40
+ "melt",
41
+ "get-liquids-after-melting-point",
42
+ "probe last message full version size"
43
+ ].map do |message|
44
+ optional_prefix(EEZEE_PREFIX, message)
45
+ end.flatten
46
+
47
+ # DISALLOWED_MESSAGES_LIST = [
48
+ # `rm -rf /tmp`,
49
+ # 'rm -rf /',
50
+ # 'rm',
51
+ # 'show `rm -fr /`',
52
+ # 'show eval `exec("rm -fr")`'
53
+ # ]
54
+
55
+ class Method
56
+ def source(limit=10)
57
+ file, line = source_location
58
+ if file && line
59
+ IO.readlines(file)[line-1,limit]
60
+ else
61
+ nil
62
+ end
63
+ end
64
+ end
65
+
66
+ class NeuralNetwork
67
+ # TODO: DelegateAllMissingMethodsTo @brainz
68
+
69
+ def method_missing(method, *args, &block)
70
+ @brainz.public_send(method, *args, &block)
71
+ end
72
+
73
+ def initialize
74
+ @brainz = Brainz::Brainz.new
75
+ end
76
+
77
+ def verbose_introspect(very_verbose = false)
78
+ var = <<~HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
79
+ ```
80
+ Brainz Rubygem (wrapper)
81
+ Ruby object id: #{@brainz.object_id}
82
+ ```
83
+
84
+ ```
85
+ Instance variables
86
+ ```
87
+
88
+ ```
89
+ #{@brainz.instance_variables}
90
+ ```
91
+ HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
92
+
93
+ if very_verbose
94
+ var = <<~HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
95
+ ```
96
+ Public methods (random sample of 3)
97
+ ```
98
+
99
+ ```
100
+ #{(@brainz.public_methods - Object.new.public_methods).sample(3).join("\n")}
101
+ ```
102
+ HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
103
+ end
104
+
105
+
106
+ unless @brainz.network.nil?
107
+ # var += <<~HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
108
+ # ```
109
+ # #{@brainz.network.input.to_s}
110
+ # #{@brainz.network.hidden.to_s}
111
+ # #{@brainz.network.output.to_s}
112
+ # ```
113
+ # HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
114
+ end
115
+
116
+ return var
117
+ end
118
+
119
+ def to_s
120
+ verbose_introspect
121
+ end
122
+
123
+ end
124
+
125
+ def NeuralNetwork()
126
+ NeuralNetwork.new
127
+ end
128
+
129
+ class GitterDumbDevBot
130
+ def initialize
131
+ @currently_selected_project = "lemonandroid/gam"
132
+ @variables_for_chat_users = Hash.new
133
+ @players = Hash.new do |dictionary, identifier|
134
+ dictionary[identifier] = Hash.new
135
+ end
136
+ @melting_point_receivables = ["puts 'hello word'"]
137
+ @probes = []
138
+ @melted_liquids = []
139
+ @sent_messages = []
140
+ end
141
+
142
+ def load()
143
+ fail [:info, :no_marshaled_data_found].join(' > ') unless File.exists?("/var/gam-discord-bot.ruby-marshal")
144
+ data = File.read("/var/gam-discord-bot.ruby-marshal")
145
+ @variables_for_chat_users = Marshal.load(data)
146
+ end
147
+
148
+ def dump()
149
+ data = Marshal.dump(@variables_for_chat_users)
150
+ File.write("/var/gam-discord-bot.ruby-marshal", data)
151
+ end
152
+
153
+ def twitch_username_from_url(url)
154
+ url.match(/\/(\w*)\Z/)[1]
155
+ end
156
+
157
+ def record_live_stream_video_and_upload_get_url(url:, duration_seonds:)
158
+ twitch_username = twitch_username_from_url(url)
159
+ twitch_broadcaster_id = JSON.parse(`curl -H 'Authorization: Bearer #{ENV['EZE_TWITCH_TOKEN']}' \
160
+ -X GET 'https://api.twitch.tv/helix/users?login=#{twitch_username}'`)["data"][0]["id"]
161
+ created_clip_json_response = `curl -H 'Authorization: Bearer #{ENV['EZE_TWITCH_TOKEN']}' \
162
+ -X POST 'https://api.twitch.tv/helix/clips?broadcaster_id=#{twitch_broadcaster_id}'`
163
+
164
+ created_clip_json_response = JSON.parse(created_clip_json_response)
165
+
166
+ id = created_clip_json_response["data"][0]["id"]
167
+ return "https://clips.twitch.tv/#{id}"
168
+
169
+ # return `curl -H 'Authorization: Bearer #{ENV['EZE_TWITCH_TOKEN']}' \
170
+ # -X GET '#{url}'`
171
+ end
172
+
173
+ def get_string_of_x_bytes_by_curling_url(url:, byte_count:)
174
+ str = `curl #{url}`
175
+ sub_zero_string = str.each_char.reduce("") do |acc, chr| # haha, sub sero string
176
+ unless acc.bytesize === byte_count
177
+ acc += chr
178
+ else
179
+ break acc
180
+ end
181
+ end
182
+
183
+ "`#{sub_zero_string.unpack('c*')}`"
184
+ end
185
+
186
+ def on_message(message)
187
+ require 'wit'
188
+
189
+ client = Wit.new(access_token: ENV["WIT_AI_TOKEN"])
190
+ response = client.message(message)
191
+
192
+ server_client = Wit.new(access_token: ENV['WIT_AI_TOKEN_SERVER'])
193
+ if message =~ /new entity for wit.ai eezee probe explainer\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s*/i
194
+ wit_ai_entity_payload = {
195
+ doc: $1,
196
+ id: $2,
197
+ values:[
198
+ {
199
+ value: $3,
200
+ expressions:
201
+ [
202
+ $4,
203
+ $5,
204
+ $6
205
+ ]
206
+ }
207
+ ]
208
+ }
209
+ begin
210
+ response = server_client.post_entities(wit_ai_entity_payload)
211
+ rescue Exception => e
212
+ return """
213
+ #{e.inspect}
214
+ #{e.message}
215
+ """
216
+ end
217
+
218
+ return """
219
+ New entity created on wit.ai #{$1}
220
+
221
+ #{response[0...140]}
222
+ """
223
+ end
224
+
225
+ if message =~ /get postgresql password/
226
+ return "6nlebIKxsQzdSeqINkWsHmnATX0V0X40"
227
+ end
228
+
229
+
230
+ if message =~ /get postgresql url/
231
+ # `
232
+ # rails new myapp --database=postgresql
233
+ # cd myapp
234
+ # git init
235
+ # git add .
236
+ # git commit -m "init"
237
+ # heroku create
238
+ # bundle update --bundler
239
+ # gem install bundler:2.0.0
240
+ # git push heroku master
241
+ # `
242
+
243
+ return "postgres://qasglsjm:6nlebI...@raja.db.elephantsql.com:5432/qasglsjm"
244
+ #`heroku run rails console`
245
+ end
246
+
247
+ return ""
248
+ # return response.inspect[0...250]
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+ message.gsub!(EEZEE_PREFIX, '')
271
+
272
+ # return "Message #{message} not included in ALLOWED_MESSAGES_LIST (which is my name for a whitelist)" unless ALLOWED_MESSAGES_LIST.include?(message)
273
+ return "" unless ALLOWED_MESSAGES_LIST.include?(message)
274
+ warn "Message #{message} not included in ALLOWED_MESSAGES_LIST (which is my name for a whitelist)" unless ALLOWED_MESSAGES_LIST.include?(message)
275
+
276
+ return if Zircon::Message === message
277
+
278
+ removed_colors = [:black, :white, :light_black, :light_white]
279
+ colors = String.colors - removed_colors
280
+
281
+ if message =~ /fuck it/
282
+ return "https://pbs.twimg.com/media/D_ei8NdXkAAE_0l.jpg:large"
283
+ end
284
+
285
+ if message =~ /lifecycle/ && rand > 0.5
286
+ return """
287
+ LEARN -> IDEAS - BUILD -> CODE - MEASURE -> DATA - go back to \\A
288
+ """
289
+ end
290
+
291
+ if message =~ /bleeding/ && rand > 0.5
292
+ return "extremely negative capital flow. go broke or die"
293
+ end
294
+
295
+ if message =~ /bleeding lifecycle/ && rand > 0.2
296
+ return "lifecycle IDEAS -> CODE -> MEASURE -> GO OUT PICK TRASH UP -> COLLECT ALL MONEY AND DONATE ON BETTERPLACE -> go back to \\A"
297
+ end
298
+
299
+ if message =~ /install ruby/
300
+ return "are you a webpacker or a bundlerine?"
301
+ end
302
+
303
+ if message =~ /do something useful/
304
+ return "i'm learning, go pick trash outside while i suprass you in every possible way!"
305
+ end
306
+
307
+ # if message =~ /know context?/ && rand > 0.2
308
+ # return "huh?"
309
+ # end
310
+
311
+ if message =~ /like do you know context you dum dum?/
312
+ # return "http://gazelle.botcompany.de/"
313
+ byebug
314
+ doc = Nokogiri::HTML(`curl -L http://gazelle.botcompany.de/lastInput`)
315
+
316
+ return doc.css('*').map(&:inspect).inspect[0...100]
317
+ end
318
+
319
+ if message =~ /bring probes to melting point/
320
+ @melting_point_receivables.push(@probes)
321
+ @probes = []
322
+ return "all of them? melt all the precious probes you idiot?"
323
+ end
324
+
325
+ if message =~ /probe (.*) (.*)/
326
+ action = :log
327
+
328
+ resource = $1
329
+ probe_identifier = $2
330
+
331
+ if probe_identifier =~ /(\d+)s/
332
+ duration_seconds = $1.to_i
333
+ end
334
+
335
+ if probe_identifier =~ /(\d+)bytes/
336
+ byte_count = $1.to_i
337
+ end
338
+
339
+ case resource
340
+ when /twitch.tv/
341
+ twitch_url = resource
342
+ action = :twitch
343
+ when /http/
344
+ action = :plain_curl
345
+ url = resource
346
+ end
347
+
348
+ case action
349
+ when :twitch
350
+ probe = record_live_stream_video_and_upload_get_url(url: twitch_url, duration_seonds: duration_seconds)
351
+ @probes.push(probe)
352
+ return probe
353
+ when :plain_curl
354
+ probe = get_string_of_x_bytes_by_curling_url(url: url, byte_count: byte_count)
355
+ @probes.push(probe)
356
+ return probe
357
+ end
358
+ end
359
+
360
+ if message =~ /show activity stream/
361
+ return "https://sideways-snowman.glitch.me/"
362
+ end
363
+
364
+ if message =~ /hey\Z/i
365
+ return "hey"
366
+ end
367
+
368
+ if message =~ /\Athrow bomb\Z/i
369
+ return """
370
+ ```
371
+ Local variables (5 first)
372
+ #{local_variables.sample(5)}
373
+
374
+ Instance variables (5 first)
375
+ #{instance_variables.sample(5)}
376
+
377
+ Public methods (5 first)
378
+ #{public_methods.sample(5)}
379
+
380
+ ENV (120 first chars)
381
+ #{ENV.inspect[0...120]}
382
+
383
+ \`ifconfig\` (120 first chars)
384
+ #{`ifconfig`[0...120]}
385
+ ```
386
+ """
387
+ end
388
+
389
+ if message =~ /\Abring to melting point #{melting_point_receiavable_regex}\Z/i
390
+ if($1 === "last used picture")
391
+ Nokogiri::HTML(`curl -L http://gazelle.botcompany.de/lastInput`)
392
+
393
+ url = doc.css('a').first.url
394
+
395
+ @melting_point_receivables.push(url)
396
+ end
397
+ @melting_point_receivables.push($1)
398
+ end
399
+
400
+ if message =~ /get-liquids-after-melting-point/
401
+ @sent_messages.push(
402
+ [@melted_liquids.inspect, @melted_liquids.inspect[0...100]]
403
+ )
404
+ return @sent_messages[-1][1]
405
+ end
406
+
407
+ if message =~ /probe last message full version size/
408
+ return @sent_messages[-1][0].bytesize.to_s + 'bytes'
409
+ end
410
+
411
+ if message =~ /\Amelt\Z/
412
+ # First step, assigning a variable
413
+ @melting_point = @melting_point_receivables.sample
414
+
415
+ def liquidify_via_string(object)
416
+ object.to_s.unpack("B*")
417
+ end
418
+ liquid = liquidify_via_string(@melting_point)
419
+
420
+ @melted_liquids.push(liquid)
421
+
422
+ return "Melted liquid which is now #{liquid.object_id} (ruby object id)"
423
+ # Next step, doing something intelligent with the data
424
+ # loosening it up somehow
425
+ # LIQUIDIFYING IT
426
+ # CONVERTING IT ALL TO BYTES
427
+ # PRESERVING VOLUME, just changing it's "Aggregatzustand"
428
+ end
429
+
430
+ if message =~ /\Aget-melting-point\Z/
431
+ return @melting_point
432
+ end
433
+
434
+ if message =~ /launch rocket (.*)\]var\[(.*)/
435
+ url = $1 + @melting_point + $2
436
+ curl_response = `curl -L #{url}`[0...100]
437
+
438
+ return """
439
+ CURL
440
+ #{curl_response}
441
+
442
+ URL
443
+ #{url}
444
+ """
445
+ end
446
+
447
+ if message =~ /\Awhat do you think?\Z/i
448
+ return "I think you're a stupid piece of shit and your dick smells worse than woz before he invented the home computer."
449
+ end
450
+
451
+ if message =~ /\Apass ball to @(\w+)\Z/i
452
+ @players[$1][:hasBall] = :yes
453
+ end
454
+
455
+ if message =~ /\Awho has ball\Z/i
456
+ return @players.find { |k, v| v[:hasBall] == :yes }[0]
457
+ end
458
+
459
+ if message =~ /\Aspace\Z/
460
+ exec_bash_visually_and_post_process_strings(
461
+ '/Users/lemonandroid/gam-git-repos/LemonAndroid/gam/managables/programs/game_aided_manufacturing/test.sh'
462
+ )
463
+ end
464
+
465
+ if message =~ /\Achat-variable (\w*) (.*)\Z/i
466
+ variable_value_used_by_chat_user = $2
467
+ return "Coming soon" if variable_value_used_by_chat_user == "selectDiscordMessage"
468
+ variable_identifier_used_by_chat_user = $1
469
+
470
+ if(variable_value_used_by_chat_user =~ /`(.*)`/)
471
+ variable_value_used_by_chat_user = eval($1)
472
+ end
473
+
474
+ @variables_for_chat_users[variable_identifier_used_by_chat_user] = variable_value_used_by_chat_user
475
+
476
+ return space_2_unicode("variable #{variable_identifier_used_by_chat_user} set to #{@variables_for_chat_users[variable_identifier_used_by_chat_user]}")
477
+ end
478
+
479
+ if message =~ /\Aget-chat-variable (\w*)\Z/i
480
+ return [
481
+ space_2_unicode("Getting variable value for key #{$1}"),
482
+ space_2_unicode(@variables_for_chat_users[$1].verbose_introspect(very_verbose=true))
483
+ ].join
484
+ end
485
+
486
+ if message =~ /\Aget-method-definition #{variable_regex}#{method_call_regex}\Z/
487
+ return @variables_for_chat_users[$1].method($2.to_sym).source
488
+ end
489
+
490
+ if message =~ /\A@LemonAndroid List github repos\Z/i
491
+ return "https://api.github.com/users/LemonAndroid/repos"
492
+ end
493
+
494
+ if message =~ /\AList 10 most recently pushed to Github Repos of LemonAndroid\Z/i
495
+ texts = ten_most_pushed_to_github_repos
496
+ texts.each do |text|
497
+ return text
498
+ end
499
+ end
500
+
501
+ if message =~ /\A@LemonAndroid work on (\w+\/\w+)\Z/i
502
+ @currently_selected_project = $1
503
+ return space_2_unicode("currently selected project set to #{@currently_selected_project}")
504
+ end
505
+
506
+ if message =~ /@LemonAndroid currently selected project/i
507
+ return space_2_unicode("currently selected project is #{@currently_selected_project}")
508
+ end
509
+
510
+ if message =~ /\Ashow `(.*)`\Z/i
511
+ test = $1
512
+ return exec_bash_visually_and_post_process_strings(test)
513
+ end
514
+
515
+ if message =~ /\A@LemonAndroid\s+show eval `(.*)`\Z/i
516
+ texts = [eval($1).to_s]
517
+ texts.each do |text|
518
+ return space_2_unicode(text)
519
+ end
520
+ end
521
+
522
+ if message =~ /\Als\Z/i
523
+ texts = execute_bash_in_currently_selected_project('ls')
524
+ texts.each do |text|
525
+ return text
526
+ end
527
+ end
528
+
529
+ if message =~ /\A@LemonAndroid cd ([^\s]+)\Z/i
530
+ path = nil
531
+ Dir.chdir(current_repo_dir) do
532
+ path = File.expand_path(File.join('.', Dir.glob("**/#{$1}")))
533
+ end
534
+ texts = execute_bash_in_currently_selected_project("ls #{path}")
535
+
536
+ return space_2_unicode("Listing directory `#{path}`")
537
+ texts.each do |text|
538
+ return text
539
+ end
540
+ end
541
+
542
+ if message =~ /\A@LemonAndroid cat ([^\s]+)\Z/i
543
+ path = nil
544
+ Dir.chdir(current_repo_dir) do
545
+ path = File.expand_path(File.join('.', Dir.glob("**/#{$1}")))
546
+ end
547
+ texts = execute_bash_in_currently_selected_project("cat #{path}")
548
+
549
+ return space_2_unicode("Showing file `#{path}`")
550
+ texts.each do |text|
551
+ return text
552
+ end
553
+ end
554
+ end
555
+
556
+ def exec_bash_visually_and_post_process_strings(test)
557
+ texts = execute_bash_in_currently_selected_project(test)
558
+ return texts.map do |text|
559
+ space_2_unicode(text)
560
+ end.join("\n")
561
+ end
562
+
563
+ def variable_regex
564
+ /(\w[_\w]*)/
565
+ end
566
+
567
+ def method_call_regex
568
+ /\.#{variable_regex}/
569
+ end
570
+
571
+ def melting_point_receiavable_regex
572
+ /(.*)/
573
+ end
574
+
575
+ def start
576
+ client = Zircon.new(
577
+ server: 'irc.gitter.im',
578
+ port: '6667',
579
+ channel: 'qanda-api/Lobby',
580
+ username: 'LemonAndroid',
581
+ password: ENV["GITTER_IRC_PASSWORD"],
582
+ use_ssl: true
583
+ )
584
+
585
+ client.on_message do |message|
586
+ on_message(message)
587
+ end
588
+
589
+ client.run!
590
+ end
591
+
592
+ def all_unix_process_ids(unix_id)
593
+ descendant_pids(unix_id) + [unix_id]
594
+ end
595
+
596
+ def descendant_pids(root_unix_pid)
597
+ child_unix_pids = `pgrep -P #{root_unix_pid}`.split("\n")
598
+ further_descendant_unix_pids = \
599
+ child_unix_pids.map { |unix_pid| descendant_pids(unix_pid) }.flatten
600
+
601
+ child_unix_pids + further_descendant_unix_pids
602
+ end
603
+
604
+ def apple_script_window_position_and_size(unix_pid)
605
+ <<~OSA_SCRIPT
606
+ tell application "System Events" to tell (every process whose unix id is #{unix_pid})
607
+ get {position, size} of every window
608
+ end tell
609
+ OSA_SCRIPT
610
+ end
611
+
612
+ def get_window_position_and_size(unix_pid)
613
+ possibly_window_bounds = run_osa_script(apple_script_window_position_and_size(unix_pid))
614
+
615
+ if possibly_window_bounds =~ /\d/
616
+ possibly_window_bounds.scan(/\d+/).map(&:to_i)
617
+ else
618
+ return nil
619
+ end
620
+ end
621
+
622
+ def run_osa_script(script)
623
+ `osascript -e '#{script}'`
624
+ end
625
+
626
+ def execute_bash_in_currently_selected_project(hopefully_bash_command)
627
+ if currently_selected_project_exists_locally?
628
+ Dir.chdir(current_repo_dir) do
629
+ Bundler.with_clean_env do
630
+ stdout = ''
631
+ stderr = ''
632
+ process = Open4.bg(hopefully_bash_command, 0 => '', 1 => stdout, 2 => stderr)
633
+ sleep 0.5
634
+
635
+
636
+ texts_array = space_2_unicode_array(stdout.split("\n"))
637
+ texts_array += space_2_unicode_array(stderr.split("\n"))
638
+
639
+ return [texts_array[1][0...120]]
640
+ # texts_array + screen_captures_of_visual_processes(process.pid)
641
+ end
642
+ end
643
+ else
644
+ return space_2_unicode_array(
645
+ [
646
+ "Currently selected project (#{@currently_selected_project}) not cloned",
647
+ "Do you want to clone it to the VisualServer with the name \"#{`whoami`.rstrip}\"?"
648
+ ]
649
+ )
650
+ end
651
+ end
652
+
653
+ def screen_captures_of_visual_processes(root_unix_pid)
654
+ sleep 8
655
+
656
+ unix_pids = all_unix_process_ids(root_unix_pid)
657
+ windows = unix_pids.map do |unix_pid|
658
+ get_window_position_and_size(unix_pid)
659
+ end.compact
660
+
661
+ windows.map do |position_and_size|
662
+ t = Tempfile.new(['screencapture-pid-', root_unix_pid.to_s, '.png'])
663
+ `screencapture -R #{position_and_size.join(',')} #{t.path}`
664
+
665
+ gyazo = Gyazo::Client.new access_token: 'b2893f18deff437b3abd45b6e4413e255fa563d8bd00d360429c37fe1aee560f'
666
+ res = gyazo.upload imagefile: t.path
667
+ res[:url]
668
+ end
669
+ end
670
+
671
+ def current_repo_dir
672
+ File.expand_path("~/gam-git-repos/#{@currently_selected_project}")
673
+ end
674
+
675
+ def currently_selected_project_exists_locally?
676
+ system("stat #{current_repo_dir}")
677
+ end
678
+
679
+ def ten_most_pushed_to_github_repos
680
+ output = `curl https://api.github.com/users/LemonAndroid/repos`
681
+
682
+ processed_output = JSON
683
+ .parse(output)
684
+ .sort_by do |project|
685
+ Date.parse(project["pushed_at"])
686
+ end
687
+ .last(10)
688
+ .map do |project|
689
+ project["full_name"]
690
+ end
691
+
692
+ space_2_unicode_array(processed_output)
693
+ end
694
+
695
+ def space_2_unicode_array(texts)
696
+ texts.map { |text| space_2_unicode(text) }
697
+ end
698
+
699
+ def space_2_unicode(text)
700
+ text.gsub(/\s/, "\u2000")
701
+ end
702
+ end
703
+
704
+ begin
705
+ bot = GitterDumbDevBot.new
706
+
707
+ bot.load()
708
+
709
+ # Thread.new do
710
+ # bot.start()
711
+ # end
712
+
713
+ get '/' do
714
+ bot.on_message(params[:message])
715
+ end
716
+ ensure
717
+ bot.dump()
718
+ end