ezii 0.0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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