ezii 0.0.0.1 → 1.0.0

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.
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