ezii 0.0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/ezii-client/Gemfile +6 -0
  3. data/ezii-client/Gemfile.lock +32 -0
  4. data/ezii-client/Procfile +2 -0
  5. data/ezii-client/README.md +16 -0
  6. data/ezii-client/chat.txt +1446 -0
  7. data/ezii-client/config.ru +1 -0
  8. data/ezii-client/fake.rb +5 -0
  9. data/ezii-client/managables/programs/game_aided_manufacturing/functions/base_command.rb +26 -0
  10. data/ezii-client/managables/programs/game_aided_manufacturing/functions/mouse_y_axis_to_3d_z_axis.rb +4 -0
  11. data/ezii-client/managables/programs/game_aided_manufacturing/functions/record_audio_and_send_to_wit.rb +18 -0
  12. data/ezii-client/managables/programs/game_aided_manufacturing/functions/rotate_camera_axis_using_mouse_drag.rb +37 -0
  13. data/ezii-client/managables/programs/game_aided_manufacturing/functions/selection_cube.rb +35 -0
  14. data/ezii-client/managables/programs/game_aided_manufacturing/gam.rb +388 -0
  15. data/ezii-client/managables/programs/game_aided_manufacturing/gems.locked +75 -0
  16. data/ezii-client/managables/programs/game_aided_manufacturing/gems.rb +10 -0
  17. data/ezii-client/managables/programs/game_aided_manufacturing/lib/drb_server.rb +13 -0
  18. data/ezii-client/managables/programs/game_aided_manufacturing/lib/mittsu_monkeypatches/box_geometry.rb +5 -0
  19. data/ezii-client/managables/programs/game_aided_manufacturing/runnable.rb +20 -0
  20. data/ezii-client/managables/programs/game_aided_manufacturing/shapes/cube.rb +29 -0
  21. data/ezii-client/managables/programs/game_aided_manufacturing/sig/runable.rbi +9 -0
  22. data/ezii-client/managables/programs/game_aided_manufacturing/test.sh +5 -0
  23. data/ezii-client/managables/programs/game_aided_manufacturing/test/commands/test_move_cube.rb +18 -0
  24. data/ezii-client/managables/programs/game_aided_manufacturing/test/commands/test_selection_cube.rb +31 -0
  25. data/ezii-client/managables/programs/game_aided_manufacturing/test/test_command_remapping.rb +30 -0
  26. data/ezii-client/managables/programs/game_aided_manufacturing/test/test_helper.rb +75 -0
  27. data/ezii-client/managables/services/chat-bot-integrations/chat.txt +15 -0
  28. data/ezii-client/managables/services/chat-bot-integrations/gems.locked +66 -0
  29. data/ezii-client/managables/services/chat-bot-integrations/gems.rb +18 -0
  30. data/ezii-client/managables/services/chat-bot-integrations/gitter_zircon.rb +644 -0
  31. data/ezii-client/managables/services/chat-bot-integrations/regexes.rb +240 -0
  32. data/ezii-client/managables/services/chat-bot-integrations/setup-mac-os-x.sh +0 -0
  33. data/ezii-client/managables/services/chat-bot-integrations/setup.sh +1 -0
  34. data/ezii-client/managables/services/chat-bot-integrations/start.sh +3 -0
  35. data/ezii-client/managables/services/error-inspect/simplest-log +1 -0
  36. data/ezii-client/managables/services/error-inspect/simplest-log-init +1 -0
  37. data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/ascii_nebuchadnezzar +9 -0
  38. data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/chat.txt +1 -0
  39. data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/twitch_zircon.rb +61 -0
  40. data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/zion_fleet.rb +198 -0
  41. data/ezii-client/managables/services/livestream-interactive/chat.txt +40 -0
  42. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/README.md +3 -0
  43. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/__main__.js +58 -0
  44. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/black-out-random-word.js +74 -0
  45. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-sentence.js +57 -0
  46. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-wikipedia-page.js +25 -0
  47. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-words.js +34 -0
  48. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/rare-enough-word.js +41 -0
  49. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/wikipedia-page.js +35 -0
  50. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/package.json +20 -0
  51. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/statistics/count-word.js +12 -0
  52. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/utils/log-to-natural-database.js +10 -0
  53. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/word2vec-models/test-text8-vector.bin +0 -0
  54. data/ezii-client/managament_interface/gems.locked +13 -0
  55. data/ezii-client/managament_interface/gems.rb +3 -0
  56. data/ezii-client/managament_interface/management_interface +4 -0
  57. data/ezii-client/managament_interface/runnable.rb +30 -0
  58. data/ezii-client/rocknrolla +1 -0
  59. data/ezii-client/start.sh +2 -0
  60. data/ezii-client/test.wav +0 -0
  61. data/ezii-misc/detect-intent-from-git-patch.rb +46 -0
  62. data/ezii-server/Gemfile +23 -0
  63. data/ezii-server/Gemfile.lock +84 -0
  64. data/ezii-server/README.md +13 -0
  65. data/ezii-server/config.ru +2 -0
  66. data/ezii-server/eezee.rb +1243 -0
  67. data/ezii-server/httpsprojecteulernetproblem=155.png +0 -0
  68. data/ezii-server/httpsprojecteulernetproblem=205.png +0 -0
  69. data/ezii-server/httpsprojecteulernetproblem=228.png +0 -0
  70. data/ezii-server/httpsprojecteulernetproblem=262.png +0 -0
  71. data/ezii-server/httpsprojecteulernetproblem=3.png +0 -0
  72. data/ezii-server/httpsprojecteulernetproblem=333.png +0 -0
  73. data/ezii-server/httpsprojecteulernetproblem=334.png +0 -0
  74. data/ezii-server/httpsprojecteulernetproblem=337.png +0 -0
  75. data/ezii-server/httpsprojecteulernetproblem=426.png +0 -0
  76. data/ezii-server/httpsprojecteulernetproblem=442.png +0 -0
  77. data/ezii-server/httpsprojecteulernetproblem=449.png +0 -0
  78. data/ezii-server/httpsprojecteulernetproblem=497.png +0 -0
  79. data/ezii-server/httpsprojecteulernetproblem=51.png +0 -0
  80. data/ezii-server/httpsprojecteulernetproblem=514.png +0 -0
  81. data/ezii-server/httpsprojecteulernetproblem=520.png +0 -0
  82. data/ezii-server/httpsprojecteulernetproblem=571.png +0 -0
  83. data/ezii-server/httpsprojecteulernetproblem=587.png +0 -0
  84. data/ezii-server/httpsprojecteulernetproblem=588.png +0 -0
  85. data/ezii-server/httpsprojecteulernetproblem=599.png +0 -0
  86. data/ezii-server/httpsprojecteulernetproblem=72.png +0 -0
  87. data/ezii-server/httpsprojecteulernetproblem=93.png +0 -0
  88. data/ezii-server/regexes +258 -0
  89. data/ezii-server/sample.wav +0 -0
  90. data/ezii.gemspec +13 -0
  91. metadata +132 -0
@@ -0,0 +1,75 @@
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
+ ast (2.4.0)
10
+ ast_utils (0.3.0)
11
+ parser (~> 2.4)
12
+ thor (>= 0.19)
13
+ byebug (11.0.1)
14
+ chunky_png (1.3.11)
15
+ coderay (1.1.2)
16
+ concurrent-ruby (1.1.5)
17
+ ffi (1.11.1)
18
+ i18n (1.6.0)
19
+ concurrent-ruby (~> 1.0)
20
+ language_server-protocol (3.14.0.1)
21
+ listen (3.1.5)
22
+ rb-fsevent (~> 0.9, >= 0.9.4)
23
+ rb-inotify (~> 0.9, >= 0.9.7)
24
+ ruby_dep (~> 1.2)
25
+ method_source (0.9.2)
26
+ minitest (5.11.3)
27
+ mittsu (0.3.0)
28
+ chunky_png (~> 1.3)
29
+ ffi (~> 1.9)
30
+ opengl-bindings (~> 1.5)
31
+ opengl-bindings (1.6.9)
32
+ os (1.0.1)
33
+ parser (2.6.3.0)
34
+ ast (~> 2.4.0)
35
+ pry (0.12.2)
36
+ coderay (~> 1.1.0)
37
+ method_source (~> 0.9.0)
38
+ pry-remote (0.1.8)
39
+ pry (~> 0.9)
40
+ slop (~> 3.0)
41
+ rainbow (2.2.2)
42
+ rake
43
+ rake (12.3.2)
44
+ rb-fsevent (0.10.3)
45
+ rb-inotify (0.10.0)
46
+ ffi (~> 1.0)
47
+ ruby_dep (1.5.0)
48
+ slop (3.6.0)
49
+ steep (0.11.0)
50
+ activesupport (~> 5.1)
51
+ ast_utils (~> 0.3.0)
52
+ language_server-protocol (~> 3.14.0)
53
+ listen (~> 3.1)
54
+ parser (~> 2.4)
55
+ pry (~> 0.12.2)
56
+ rainbow (~> 2.2.2, < 4.0)
57
+ thor (0.20.3)
58
+ thread_safe (0.3.6)
59
+ tzinfo (1.2.5)
60
+ thread_safe (~> 0.1)
61
+ wit (6.0.0)
62
+
63
+ PLATFORMS
64
+ ruby
65
+
66
+ DEPENDENCIES
67
+ byebug
68
+ mittsu
69
+ os
70
+ pry-remote
71
+ steep
72
+ wit
73
+
74
+ BUNDLED WITH
75
+ 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 'wit'
@@ -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,20 @@
1
+ require_relative 'gam'
2
+ require_relative 'lib/drb_server.rb'
3
+
4
+
5
+ gam = Gam.new
6
+
7
+
8
+ WIT = Wit.new(access_token: ENV['WIT_AI_TOKEN_SERVER'])
9
+
10
+
11
+ Thread.new do
12
+ if WIT.get_entity('intent').grep(/.*move.*cube.*/)
13
+ gam.move_cube(:any, [rand(), rand(), rand()])
14
+ end
15
+ end
16
+
17
+
18
+ DrbServer.new(gam).start
19
+
20
+ gam.start
@@ -0,0 +1,29 @@
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 method_missing(method_name, *args, &block)
27
+ @mittsu_object.public_send(method_name, *args, &block)
28
+ end
29
+ 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,18 @@
1
+ require_relative '../test_helper.rb'
2
+ require 'byebug'
3
+
4
+ module SystemTests
5
+ class TestSelectionCube < AbstractSystemTest
6
+ def test_move_any_cube_somehow
7
+ open_gam_window do |console_stdin, console_stdout|
8
+ cubes_before = drb_interface.cubes
9
+
10
+ assert_equal cubes_after, cubes_before
11
+ drb_interface.move_cube(:any, *[rand(), rand(), rand()])
12
+ cubes_after = drb_interface.cubes
13
+
14
+ refute_equal cubes_after, cubes_before
15
+ end
16
+ end
17
+ end
18
+ end
@@ -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,66 @@
1
+ GIT
2
+ remote: https://github.com/icetiger-tec/zircon.git
3
+ revision: b40496d72d8fa8590375a85c5684deb45c3fcd70
4
+ specs:
5
+ zircon (0.0.8)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ addressable (2.6.0)
11
+ public_suffix (>= 2.0.2, < 4.0)
12
+ brainz (0.2.0)
13
+ bugsnag (6.11.1)
14
+ concurrent-ruby (~> 1.0)
15
+ bugsnag-api (2.0.2)
16
+ sawyer (~> 0.8.1)
17
+ byebug (11.0.1)
18
+ colorize (0.8.1)
19
+ concurrent-ruby (1.1.5)
20
+ faraday (0.15.4)
21
+ multipart-post (>= 1.2, < 3)
22
+ gyazo (3.0.1)
23
+ faraday
24
+ mime-types
25
+ multipart-post
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
+ multipart-post (2.1.1)
31
+ mustermann (1.0.3)
32
+ nokogiri (1.10.3)
33
+ mini_portile2 (~> 2.4.0)
34
+ open4 (1.3.4)
35
+ public_suffix (3.1.1)
36
+ rack (2.0.7)
37
+ rack-protection (2.0.5)
38
+ rack
39
+ sawyer (0.8.2)
40
+ addressable (>= 2.3.5)
41
+ faraday (> 0.8, < 2.0)
42
+ sinatra (2.0.5)
43
+ mustermann (~> 1.0)
44
+ rack (~> 2.0)
45
+ rack-protection (= 2.0.5)
46
+ tilt (~> 2.0)
47
+ tilt (2.0.9)
48
+
49
+ PLATFORMS
50
+ ruby
51
+
52
+ DEPENDENCIES
53
+ brainz
54
+ bugsnag
55
+ bugsnag-api
56
+ bundler
57
+ byebug
58
+ colorize
59
+ gyazo
60
+ nokogiri
61
+ open4
62
+ sinatra
63
+ zircon!
64
+
65
+ BUNDLED WITH
66
+ 2.1.0.pre.1
@@ -0,0 +1,18 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'zircon', github: 'icetiger-tec/zircon'
4
+ gem 'colorize'
5
+ gem 'byebug'
6
+ gem 'gyazo'
7
+ gem 'open4'
8
+
9
+ gem 'brainz'
10
+ gem 'bundler'
11
+
12
+ gem 'sinatra'
13
+
14
+ gem 'nokogiri'
15
+
16
+ gem 'bugsnag'
17
+
18
+ gem 'bugsnag-api'
@@ -0,0 +1,644 @@
1
+ # LemonAndroidToday at 6:56 PM
2
+ # grep last message RBENV
3
+ # pass ball to @notify.me
4
+ # eezee probe twitter.com/lemonandroid 5
5
+ # eezee probe "bundle exec rails new"
6
+ # reset-eezee-probe
7
+ # eezee probe "bundle exec rails new"
8
+ # eezee probe "cd last-project"
9
+ # eezee probe "bundle exec rails scaffold melts name:string type:string"
10
+ # eezee probe "upload current-project"
11
+ # bring to melting point eezee probe
12
+ # melt by using wit.ai into "melt-rails-app" liquid
13
+ # melting-point-show-liquids
14
+ # cast "melt-rails-app-batch-0" from "melt-rails-app" lliquid
15
+ # show melt-rails-app-batch-0 :3000
16
+ # launch rocket "ask common stackoverflow questions" carry melt-rails-app-batch-0 > controllers folder
17
+ # what do you think @stefan reich?
18
+
19
+
20
+
21
+ require 'zircon'
22
+ require 'colorize'
23
+ require 'byebug'
24
+ require 'json'
25
+ require 'date'
26
+ require 'timeout'
27
+ require 'gyazo'
28
+ require 'open4'
29
+ require 'brainz'
30
+ require 'bundler'
31
+ require 'sinatra'
32
+ require 'nokogiri'
33
+ require 'sinatra'
34
+ require 'bugsnag'
35
+ require 'bugsnag/api'
36
+
37
+ Bugsnag.configure do |config|
38
+ config.api_key = "3bda845ddbc9ddabefbdabb3a8cda431"
39
+ end
40
+
41
+ set :raise_errors, true
42
+
43
+ use Bugsnag::Rack
44
+
45
+ # class Object
46
+ # def ===(method, *args, &block)
47
+ # TODO: also alllow Module === object => true if Module::Class === object => true
48
+ # end
49
+ # end
50
+
51
+ def optional_prefix(prefix, message)
52
+ [prefix + message, message]
53
+ end
54
+
55
+ EEZEE_PREFIX = "eezee" + " "
56
+
57
+ ALLOWED_MESSAGES_LIST = [
58
+ "show `say i am so easy you can do whatever you like with me`",
59
+ "hey",
60
+ "show `whoami`",
61
+ "show `ifconfig`",
62
+ "chat-variable bot0 `NeuralNetwork()`",
63
+ "get-chat-variable bot0",
64
+ "What do you think?",
65
+ "get-method-definition bot0.num_hidden",
66
+ "chat-variable bot0brainz selectDiscordMessage",
67
+ "throw bomb",
68
+ "pass ball to @user",
69
+ "who has ball",
70
+ "space",
71
+ "launch rocket google.com?q=]var[",
72
+ "launch rocket http://www.gigablast.com/search?c=main&format=json&q=]var[",
73
+ "launch rocket http://agi.blue/]var[",
74
+ "show activity stream",
75
+ "bring to melting point https://css-tricks.com/wp-content/uploads/2018/10/align-items.svg",
76
+ "melt",
77
+ "get-melting-point",
78
+ "bring to melting point last used picture",
79
+ "probe https://www.twitch.tv/jamiepinelive 10s",
80
+ "probe https://www.twitch.tv/sudokid 5s",
81
+ "probe https://www.twitch.tv/dowright 5s",
82
+ "probe https://github.com/facebook/relay/commit/377ca939b5f5b46d57e11d4a1dfa7c4aecf5666b 50bytes",
83
+ "probe https://github.com/facebook/relay/commit/377ca939b5f5b46d57e11d4a1dfa7c4aecf5666b 150bytes",
84
+ "bring probes to melting point",
85
+ "throw bugsnag bomb"
86
+ ].map do |message|
87
+ optional_prefix(EEZEE_PREFIX, message)
88
+ end.flatten
89
+
90
+ # DISALLOWED_MESSAGES_LIST = [
91
+ # `rm -rf /tmp`,
92
+ # 'rm -rf /',
93
+ # 'rm',
94
+ # 'show `rm -fr /`',
95
+ # 'show eval `exec("rm -fr")`'
96
+ # ]
97
+
98
+ class Method
99
+ def source(limit=10)
100
+ file, line = source_location
101
+ if file && line
102
+ IO.readlines(file)[line-1,limit]
103
+ else
104
+ nil
105
+ end
106
+ end
107
+ end
108
+
109
+ class NeuralNetwork
110
+ # TODO: DelegateAllMissingMethodsTo @brainz
111
+
112
+ def method_missing(method, *args, &block)
113
+ @brainz.public_send(method, *args, &block)
114
+ end
115
+
116
+ def initialize
117
+ @brainz = Brainz::Brainz.new
118
+ end
119
+
120
+ def verbose_introspect(very_verbose = false)
121
+ var = <<~HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
122
+ ```
123
+ Brainz Rubygem (wrapper)
124
+ Ruby object id: #{@brainz.object_id}
125
+ ```
126
+
127
+ ```
128
+ Instance variables
129
+ ```
130
+
131
+ ```
132
+ #{@brainz.instance_variables}
133
+ ```
134
+ HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
135
+
136
+ if very_verbose
137
+ var = <<~HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
138
+ ```
139
+ Public methods (random sample of 3)
140
+ ```
141
+
142
+ ```
143
+ #{(@brainz.public_methods - Object.new.public_methods).sample(3).join("\n")}
144
+ ```
145
+ HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
146
+ end
147
+
148
+
149
+ unless @brainz.network.nil?
150
+ # var += <<~HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
151
+ # ```
152
+ # #{@brainz.network.input.to_s}
153
+ # #{@brainz.network.hidden.to_s}
154
+ # #{@brainz.network.output.to_s}
155
+ # ```
156
+ # HUMAN_SCRIPT_INTROSPECT_FOR_DISCORD
157
+ end
158
+
159
+ return var
160
+ end
161
+
162
+ def to_s
163
+ verbose_introspect
164
+ end
165
+
166
+ def num_hidden
167
+ puts 'wau'
168
+ end
169
+
170
+ end
171
+
172
+ def NeuralNetwork()
173
+ NeuralNetwork.new
174
+ end
175
+
176
+ class GitterDumbDevBot
177
+ def initialize
178
+ @currently_selected_project = "lemonandroid/gam"
179
+ @variables_for_chat_users = Hash.new
180
+ @players = Hash.new do |dictionary, identifier|
181
+ dictionary[identifier] = Hash.new
182
+ end
183
+ @melting_point_receivables = []
184
+ @probes = []
185
+ end
186
+
187
+ def load()
188
+ fail [:info, :no_marshaled_data_found].join(' > ') unless File.exists?("/var/gam-discord-bot.ruby-marshal")
189
+ data = File.read("/var/gam-discord-bot.ruby-marshal")
190
+ @variables_for_chat_users = Marshal.load(data)
191
+ end
192
+
193
+ def dump()
194
+ data = Marshal.dump(@variables_for_chat_users)
195
+ File.write("/var/gam-discord-bot.ruby-marshal", data)
196
+ end
197
+
198
+ def twitch_username_from_url(url)
199
+ url.match(/\/(\w*)\Z/)[1]
200
+ end
201
+
202
+ def record_live_stream_video_and_upload_get_url(url:, duration_seonds:)
203
+ twitch_username = twitch_username_from_url(url)
204
+ twitch_broadcaster_id = JSON.parse(`curl -H 'Authorization: Bearer #{ENV['EZE_TWITCH_TOKEN']}' \
205
+ -X GET 'https://api.twitch.tv/helix/users?login=#{twitch_username}'`)["data"][0]["id"]
206
+ created_clip_json_response = `curl -H 'Authorization: Bearer #{ENV['EZE_TWITCH_TOKEN']}' \
207
+ -X POST 'https://api.twitch.tv/helix/clips?broadcaster_id=#{twitch_broadcaster_id}'`
208
+
209
+ created_clip_json_response = JSON.parse(created_clip_json_response)
210
+
211
+ id = created_clip_json_response["data"][0]["id"]
212
+ return "https://clips.twitch.tv/#{id}"
213
+
214
+ # return `curl -H 'Authorization: Bearer #{ENV['EZE_TWITCH_TOKEN']}' \
215
+ # -X GET '#{url}'`
216
+ end
217
+
218
+ def get_string_of_x_bytes_by_curling_url(url:, byte_count:)
219
+ str = `curl #{url}`
220
+ sub_zero_string = str.each_char.reduce("") do |acc, chr| # haha, sub sero string
221
+ unless acc.bytesize === byte_count
222
+ acc += chr
223
+ else
224
+ break acc
225
+ end
226
+ end
227
+
228
+ "`#{sub_zero_string.unpack('c*')}`"
229
+ end
230
+
231
+ def on_message(message)
232
+ message.gsub!(EEZEE_PREFIX, '')
233
+
234
+ # return "Message #{message} not included in ALLOWED_MESSAGES_LIST (which is my name for a whitelist)" unless ALLOWED_MESSAGES_LIST.include?(message)
235
+ return "" unless ALLOWED_MESSAGES_LIST.include?(message)
236
+ warn "Message #{message} not included in ALLOWED_MESSAGES_LIST (which is my name for a whitelist)" unless ALLOWED_MESSAGES_LIST.include?(message)
237
+
238
+ return if Zircon::Message === message
239
+
240
+ removed_colors = [:black, :white, :light_black, :light_white]
241
+ colors = String.colors - removed_colors
242
+
243
+ if message =~ /bring probes to melting point/
244
+ @melting_point_receivables.push(@probes)
245
+ @probes = []
246
+ return "all of them? melt all the precious probes you idiot?"
247
+ end
248
+
249
+ if message =~ /probe (.*) (.*)/
250
+ action = :log
251
+
252
+ resource = $1
253
+ probe_identifier = $2
254
+
255
+ if probe_identifier =~ /(\d+)s/
256
+ duration_seconds = $1.to_i
257
+ end
258
+
259
+ if probe_identifier =~ /(\d+)bytes/
260
+ byte_count = $1.to_i
261
+ end
262
+
263
+ case resource
264
+ when /twitch.tv/
265
+ twitch_url = resource
266
+ action = :twitch
267
+ when /http/
268
+ action = :plain_curl
269
+ url = resource
270
+ end
271
+
272
+ case action
273
+ when :twitch
274
+ probe = record_live_stream_video_and_upload_get_url(url: twitch_url, duration_seonds: duration_seconds)
275
+ @probes.push(probe)
276
+ return probe
277
+ when :plain_curl
278
+ probe = get_string_of_x_bytes_by_curling_url(url: url, byte_count: byte_count)
279
+ @probes.push(probe)
280
+ return probe
281
+ end
282
+ end
283
+
284
+ if message =~ /show activity stream/
285
+ return "https://sideways-snowman.glitch.me/"
286
+ end
287
+
288
+ if message =~ /hey\Z/i
289
+ return "hey"
290
+ end
291
+
292
+ if message =~ /\Athrow (?:(.*)\s)?bomb\Z/i
293
+ if $1 == "bugsnag"
294
+ Bugsnag::Api.configure do |config|
295
+ config.auth_token = ENV["BUGSNAG_TOKEN"]
296
+ end
297
+ organizations = Bugsnag::Api.organizations
298
+
299
+ organization = organizations.first
300
+
301
+ projects = Bugsnag::Api.projects(organization[:id])
302
+
303
+
304
+ errors = Bugsnag::Api.errors(projects[0][:id], nil)
305
+
306
+ return errors.inspect[0...500]
307
+ end
308
+
309
+ return """
310
+ ```
311
+ Local variables (5 first)
312
+ #{local_variables.sample(5)}
313
+
314
+ Instance variables (5 first)
315
+ #{instance_variables.sample(5)}
316
+
317
+ Public methods (5 first)
318
+ #{public_methods.sample(5)}
319
+
320
+ ENV (120 first chars)
321
+ #{ENV.inspect[0...120]}
322
+
323
+ \`ifconfig\` (120 first chars)
324
+ #{`ifconfig`[0...120]}
325
+ ```
326
+ """
327
+ end
328
+
329
+ if message =~ /\Abring to melting point #{melting_point_receiavable_regex}\Z/i
330
+ if($1 === "last used picture")
331
+ Nokogiri::HTML(`curl -L http://gazelle.botcompany.de/lastInput`)
332
+
333
+ url = doc.css('a').first.url
334
+
335
+ @melting_point_receivables.push(url)
336
+ end
337
+ @melting_point_receivables.push($1)
338
+ end
339
+
340
+ if message =~ /\Amelt\Z/
341
+ # First step, assigning a variable
342
+ @melting_point = @melting_point_receivables.sample
343
+
344
+ def liqudify(raw_data_object)
345
+ # https://stackoverflow.com/a/24076936/4132642
346
+ i_ptr_int = raw_data_object.object_id << 1
347
+ # https://stackoverflow.com/questions/47757960/how-to-get-value-at-a-memory-address-in-linux-shell
348
+
349
+ end
350
+ liqudify(@melting_point)
351
+
352
+ # Next step, doing something intelligent with the data
353
+ # loosening it up somehow
354
+ # LIQUIDIFYING IT
355
+ # CONVERTING IT ALL TO BYTES
356
+ # PRESERVING VOLUME, just changing it's "Aggregatzustand"
357
+ end
358
+
359
+ if message =~ /\Aget-melting-point\Z/
360
+ return @melting_point
361
+ end
362
+
363
+ if message =~ /launch rocket (.*)\]var\[(.*)/
364
+ url = $1 + @melting_point + $2
365
+ curl_response = `curl -L #{url}`[0...100]
366
+
367
+ return """
368
+ CURL
369
+ #{curl_response}
370
+
371
+ URL
372
+ #{url}
373
+ """
374
+ end
375
+
376
+ if message =~ /\Awhat do you think?\Z/i
377
+ return "I think you're a stupid piece of shit and your dick smells worse than woz before he invented the home computer."
378
+ end
379
+
380
+ if message =~ /\Apass ball to @(\w+)\Z/i
381
+ @players[$1][:hasBall] = :yes
382
+ end
383
+
384
+ if message =~ /\Awho has ball\Z/i
385
+ return @players.find { |k, v| v[:hasBall] == :yes }[0]
386
+ end
387
+
388
+ if message =~ /\Aspace\Z/
389
+ exec_bash_visually_and_post_process_strings(
390
+ '/Users/lemonandroid/gam-git-repos/LemonAndroid/gam/managables/programs/game_aided_manufacturing/test.sh'
391
+ )
392
+ end
393
+
394
+ if message =~ /\Achat-variable (\w*) (.*)\Z/i
395
+ variable_value_used_by_chat_user = $2
396
+ return "Coming soon" if variable_value_used_by_chat_user == "selectDiscordMessage"
397
+ variable_identifier_used_by_chat_user = $1
398
+
399
+ if(variable_value_used_by_chat_user =~ /`(.*)`/)
400
+ variable_value_used_by_chat_user = eval($1)
401
+ end
402
+
403
+ @variables_for_chat_users[variable_identifier_used_by_chat_user] = variable_value_used_by_chat_user
404
+
405
+ return space_2_unicode("variable #{variable_identifier_used_by_chat_user} set to #{@variables_for_chat_users[variable_identifier_used_by_chat_user]}")
406
+ end
407
+
408
+ if message =~ /\Aget-chat-variable (\w*)\Z/i
409
+ return [
410
+ space_2_unicode("Getting variable value for key #{$1}"),
411
+ space_2_unicode(@variables_for_chat_users[$1].verbose_introspect(very_verbose=true))
412
+ ].join
413
+ end
414
+
415
+ if message =~ /\Aget-method-definition #{variable_regex}#{method_call_regex}\Z/
416
+ return @variables_for_chat_users[$1].method($2.to_sym).source
417
+ end
418
+
419
+ if message =~ /\A@LemonAndroid List github repos\Z/i
420
+ return "https://api.github.com/users/LemonAndroid/repos"
421
+ end
422
+
423
+ if message =~ /\AList 10 most recently pushed to Github Repos of LemonAndroid\Z/i
424
+ texts = ten_most_pushed_to_github_repos
425
+ texts.each do |text|
426
+ return text
427
+ end
428
+ end
429
+
430
+ if message =~ /\A@LemonAndroid work on (\w+\/\w+)\Z/i
431
+ @currently_selected_project = $1
432
+ return space_2_unicode("currently selected project set to #{@currently_selected_project}")
433
+ end
434
+
435
+ if message =~ /@LemonAndroid currently selected project/i
436
+ return space_2_unicode("currently selected project is #{@currently_selected_project}")
437
+ end
438
+
439
+ if message =~ /\Ashow `(.*)`\Z/i
440
+ test = $1
441
+ exec_bash_visually_and_post_process_strings
442
+ end
443
+
444
+ if message =~ /\A@LemonAndroid\s+show eval `(.*)`\Z/i
445
+ texts = [eval($1).to_s]
446
+ texts.each do |text|
447
+ return space_2_unicode(text)
448
+ end
449
+ end
450
+
451
+ if message =~ /\Als\Z/i
452
+ texts = execute_bash_in_currently_selected_project('ls')
453
+ texts.each do |text|
454
+ return text
455
+ end
456
+ end
457
+
458
+ if message =~ /\A@LemonAndroid cd ([^\s]+)\Z/i
459
+ path = nil
460
+ Dir.chdir(current_repo_dir) do
461
+ path = File.expand_path(File.join('.', Dir.glob("**/#{$1}")))
462
+ end
463
+ texts = execute_bash_in_currently_selected_project("ls #{path}")
464
+
465
+ return space_2_unicode("Listing directory `#{path}`")
466
+ texts.each do |text|
467
+ return text
468
+ end
469
+ end
470
+
471
+ if message =~ /\A@LemonAndroid cat ([^\s]+)\Z/i
472
+ path = nil
473
+ Dir.chdir(current_repo_dir) do
474
+ path = File.expand_path(File.join('.', Dir.glob("**/#{$1}")))
475
+ end
476
+ texts = execute_bash_in_currently_selected_project("cat #{path}")
477
+
478
+ return space_2_unicode("Showing file `#{path}`")
479
+ texts.each do |text|
480
+ return text
481
+ end
482
+ end
483
+ end
484
+
485
+ def exec_bash_visually_and_post_process_strings(test)
486
+ texts = execute_bash_in_currently_selected_project(test)
487
+ return texts.map do |text|
488
+ space_2_unicode(text)
489
+ end.join("\n")
490
+ end
491
+
492
+ def variable_regex
493
+ /(\w[_\w]*)/
494
+ end
495
+
496
+ def method_call_regex
497
+ /\.#{variable_regex}/
498
+ end
499
+
500
+ def melting_point_receiavable_regex
501
+ /(.*)/
502
+ end
503
+
504
+ def start
505
+ client = Zircon.new(
506
+ server: 'irc.gitter.im',
507
+ port: '6667',
508
+ channel: 'qanda-api/Lobby',
509
+ username: 'LemonAndroid',
510
+ password: ENV["GITTER_IRC_PASSWORD"],
511
+ use_ssl: true
512
+ )
513
+
514
+ client.on_message do |message|
515
+ on_message(message)
516
+ end
517
+
518
+ client.run!
519
+ end
520
+
521
+ def all_unix_process_ids(unix_id)
522
+ descendant_pids(unix_id) + [unix_id]
523
+ end
524
+
525
+ def descendant_pids(root_unix_pid)
526
+ child_unix_pids = `pgrep -P #{root_unix_pid}`.split("\n")
527
+ further_descendant_unix_pids = \
528
+ child_unix_pids.map { |unix_pid| descendant_pids(unix_pid) }.flatten
529
+
530
+ child_unix_pids + further_descendant_unix_pids
531
+ end
532
+
533
+ def apple_script_window_position_and_size(unix_pid)
534
+ <<~OSA_SCRIPT
535
+ tell application "System Events" to tell (every process whose unix id is #{unix_pid})
536
+ get {position, size} of every window
537
+ end tell
538
+ OSA_SCRIPT
539
+ end
540
+
541
+ def get_window_position_and_size(unix_pid)
542
+ possibly_window_bounds = run_osa_script(apple_script_window_position_and_size(unix_pid))
543
+
544
+ if possibly_window_bounds =~ /\d/
545
+ possibly_window_bounds.scan(/\d+/).map(&:to_i)
546
+ else
547
+ return nil
548
+ end
549
+ end
550
+
551
+ def run_osa_script(script)
552
+ `osascript -e '#{script}'`
553
+ end
554
+
555
+ def execute_bash_in_currently_selected_project(hopefully_bash_command)
556
+ if currently_selected_project_exists_locally?
557
+ Dir.chdir(current_repo_dir) do
558
+ Bundler.with_clean_env do
559
+ stdout = ''
560
+ stderr = ''
561
+ process = Open4.bg(hopefully_bash_command, 0 => '', 1 => stdout, 2 => stderr)
562
+ sleep 1
563
+
564
+ texts_array = space_2_unicode_array(stdout.split("\n"))
565
+ texts_array += space_2_unicode_array(stderr.split("\n"))
566
+ texts_array + screen_captures_of_visual_processes(process.pid)
567
+ end
568
+ end
569
+ else
570
+ return space_2_unicode_array(
571
+ [
572
+ "Currently selected project (#{@currently_selected_project}) not cloned",
573
+ "Do you want to clone it to the VisualServer with the name \"#{`whoami`.rstrip}\"?"
574
+ ]
575
+ )
576
+ end
577
+ end
578
+
579
+ def screen_captures_of_visual_processes(root_unix_pid)
580
+ sleep 8
581
+
582
+ unix_pids = all_unix_process_ids(root_unix_pid)
583
+ windows = unix_pids.map do |unix_pid|
584
+ get_window_position_and_size(unix_pid)
585
+ end.compact
586
+
587
+ windows.map do |position_and_size|
588
+ t = Tempfile.new(['screencapture-pid-', root_unix_pid.to_s, '.png'])
589
+ `screencapture -R #{position_and_size.join(',')} #{t.path}`
590
+
591
+ gyazo = Gyazo::Client.new access_token: 'b2893f18deff437b3abd45b6e4413e255fa563d8bd00d360429c37fe1aee560f'
592
+ res = gyazo.upload imagefile: t.path
593
+ res[:url]
594
+ end
595
+ end
596
+
597
+ def current_repo_dir
598
+ File.expand_path("~/gam-git-repos/#{@currently_selected_project}")
599
+ end
600
+
601
+ def currently_selected_project_exists_locally?
602
+ system("stat #{current_repo_dir}")
603
+ end
604
+
605
+ def ten_most_pushed_to_github_repos
606
+ output = `curl https://api.github.com/users/LemonAndroid/repos`
607
+
608
+ processed_output = JSON
609
+ .parse(output)
610
+ .sort_by do |project|
611
+ Date.parse(project["pushed_at"])
612
+ end
613
+ .last(10)
614
+ .map do |project|
615
+ project["full_name"]
616
+ end
617
+
618
+ space_2_unicode_array(processed_output)
619
+ end
620
+
621
+ def space_2_unicode_array(texts)
622
+ texts.map { |text| space_2_unicode(text) }
623
+ end
624
+
625
+ def space_2_unicode(text)
626
+ text.gsub(/\s/, "\u2000")
627
+ end
628
+ end
629
+
630
+ begin
631
+ bot = GitterDumbDevBot.new
632
+
633
+ bot.load()
634
+
635
+ # Thread.new do
636
+ # bot.start()
637
+ # end
638
+
639
+ get '/' do
640
+ bot.on_message(params[:message])
641
+ end
642
+ ensure
643
+ bot.dump()
644
+ end