drakkon 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +50 -0
  3. data/bin/drakkon +16 -0
  4. data/lib/drakkon/build.rb +126 -0
  5. data/lib/drakkon/cli.rb +64 -0
  6. data/lib/drakkon/gem/bundle.rb +116 -0
  7. data/lib/drakkon/gem/cli.rb +46 -0
  8. data/lib/drakkon/gem/configure.rb +73 -0
  9. data/lib/drakkon/gem/gem.rb +56 -0
  10. data/lib/drakkon/gem/helpers/check.rb +110 -0
  11. data/lib/drakkon/gem/helpers/files.rb +57 -0
  12. data/lib/drakkon/gem/helpers/general.rb +21 -0
  13. data/lib/drakkon/gem/helpers/modules.rb +51 -0
  14. data/lib/drakkon/gem/helpers/source.rb +43 -0
  15. data/lib/drakkon/gem/install.rb +24 -0
  16. data/lib/drakkon/init.rb +85 -0
  17. data/lib/drakkon/lib/hub.rb +112 -0
  18. data/lib/drakkon/lib/images/biggest.rb +43 -0
  19. data/lib/drakkon/lib/images/blur.rb +76 -0
  20. data/lib/drakkon/lib/images/bulk_rename.rb +86 -0
  21. data/lib/drakkon/lib/images/canvas.rb +74 -0
  22. data/lib/drakkon/lib/images/cli.rb +78 -0
  23. data/lib/drakkon/lib/images/desaturate.rb +58 -0
  24. data/lib/drakkon/lib/images/flip_flop.rb +76 -0
  25. data/lib/drakkon/lib/images/gif.rb +61 -0
  26. data/lib/drakkon/lib/images/index.rb +185 -0
  27. data/lib/drakkon/lib/images/list.rb +56 -0
  28. data/lib/drakkon/lib/images/modulate.rb +69 -0
  29. data/lib/drakkon/lib/images/resize.rb +83 -0
  30. data/lib/drakkon/lib/images/roll.rb +68 -0
  31. data/lib/drakkon/lib/images/rotate.rb +60 -0
  32. data/lib/drakkon/lib/images/scale.rb +86 -0
  33. data/lib/drakkon/lib/images/sepia.rb +64 -0
  34. data/lib/drakkon/lib/images/shift.rb +89 -0
  35. data/lib/drakkon/lib/images/split.rb +93 -0
  36. data/lib/drakkon/lib/images/spritesheet.rb +85 -0
  37. data/lib/drakkon/lib/images/trim.rb +56 -0
  38. data/lib/drakkon/lib/images/white.rb +56 -0
  39. data/lib/drakkon/lib/logbot.rb +86 -0
  40. data/lib/drakkon/lib/manifest.rb +74 -0
  41. data/lib/drakkon/lib/pastel.rb +49 -0
  42. data/lib/drakkon/lib/settings.rb +130 -0
  43. data/lib/drakkon/lib/shims.rb +8 -0
  44. data/lib/drakkon/lib/version.rb +79 -0
  45. data/lib/drakkon/release.rb +3 -0
  46. data/lib/drakkon/run/commands/images.rb +14 -0
  47. data/lib/drakkon/run/commands/log.rb +57 -0
  48. data/lib/drakkon/run/commands/restart.rb +14 -0
  49. data/lib/drakkon/run/helpers.rb +60 -0
  50. data/lib/drakkon/run/reader_shim.rb +110 -0
  51. data/lib/drakkon/run/tty.rb +119 -0
  52. data/lib/drakkon/run.rb +80 -0
  53. data/lib/drakkon/setup.rb +31 -0
  54. data/lib/drakkon/skeleton/cli.rb +46 -0
  55. data/lib/drakkon/skeleton/deploy.rb +105 -0
  56. data/lib/drakkon/skeleton/helpers/check.rb +143 -0
  57. data/lib/drakkon/skeleton/helpers/general.rb +21 -0
  58. data/lib/drakkon/skeleton/helpers/source.rb +43 -0
  59. data/lib/drakkon/skeleton/install.rb +31 -0
  60. data/lib/drakkon/skeleton/template.rb +14 -0
  61. data/lib/drakkon/web.rb +68 -0
  62. data/lib/drakkon.rb +43 -0
  63. metadata +302 -0
@@ -0,0 +1,57 @@
1
+ module Drakkon
2
+ module Gems
3
+ # Gem file manipulation and selection
4
+ module GemHelpers
5
+ def select_files
6
+ data[:files] ||= {}
7
+ file_edit
8
+ end
9
+
10
+ def file_edit
11
+ # Select File
12
+ file = prompt_file
13
+ file_id = file.to_sym
14
+
15
+ if data[:files].key?(file_id) && prompt.yes?("Remove File? #{file.pastel(:bright_blue)}")
16
+ data[:files].delete file_id
17
+ return
18
+ end
19
+
20
+ # Fine Weight
21
+ weight = prompt.ask("File: #{file.pastel(:bright_blue)}, What weight?", convert: :integer, default: 10)
22
+
23
+ # Datas
24
+ file_data = {
25
+ weight:,
26
+ file:
27
+ }
28
+
29
+ # Save
30
+ data[:files][file_id] = file_data
31
+ end
32
+
33
+ def path_files
34
+ Dir["#{data[:path]}/**/*.rb"].map { |x| x.gsub("#{data[:path]}/", '') }
35
+ end
36
+
37
+ def prompt_file
38
+ prompt.select('Select File:', filter: true, per_page: 25) do |menu|
39
+ path_files.each do |file|
40
+ name = if data[:files].key? file.to_sym
41
+ "#{file.pastel(:bright_blue)} #{'✔'.pastel(:bright_green)}"
42
+ else
43
+ file
44
+ end
45
+
46
+ menu.choice name:, value: file
47
+ end
48
+ end
49
+
50
+ # Return
51
+ end
52
+
53
+ # =============================================================
54
+ end
55
+ # =============================================================
56
+ end
57
+ end
@@ -0,0 +1,21 @@
1
+ module Drakkon
2
+ module Gems
3
+ # General Helpers for Gem Class
4
+ module GemHelpers
5
+ def prompt
6
+ TTY::Prompt.new(active_color: :cyan)
7
+ end
8
+
9
+ def read_config
10
+ @config = JSON.parse(File.read(config_file), { symbolize_names: true })
11
+ end
12
+
13
+ def config_file
14
+ "#{data[:path]}/drakkon.json"
15
+ end
16
+
17
+ # =============================================================
18
+ end
19
+ # =============================================================
20
+ end
21
+ end
@@ -0,0 +1,51 @@
1
+ module Drakkon
2
+ module Gems
3
+ # General Helpers for Gem Class
4
+ module GemHelpers
5
+ def select_modules
6
+ data[:modules] = prompt_modules.map do |selected|
7
+ modules.find { |x| x[:name] == selected }
8
+ end
9
+ end
10
+
11
+ def refresh_modules
12
+ read_config
13
+ valid_structure?
14
+ load_modules
15
+
16
+ data[:modules] = data[:modules].map(&:name).map do |selected|
17
+ modules.find { |x| x[:name] == selected }
18
+ end
19
+ end
20
+
21
+ def prompt_modules
22
+ prompt.multi_select('Select Modules:', filter: true, per_page: modules.count) do |menu|
23
+ # menu.default *data[:modules].map(&:name) if data[:modules]
24
+ # menu.default 'Core - Daemon Core Modules'
25
+
26
+ defaults = []
27
+
28
+ modules.each do |mod|
29
+ # Format
30
+ name = mod.name.pastel(:bright_blue)
31
+ name += " - #{mod[:description]}".pastel(:bright_black) if mod.key?(:description)
32
+
33
+ # Preselect Previous ones if exists
34
+ defaults.push(name) if data[:modules]&.any? { |x| x[:name] == mod&.name }
35
+
36
+ # Choice
37
+ menu.choice name:, value: mod[:name]
38
+ end
39
+
40
+ # Defaults
41
+ menu.default(*defaults)
42
+ end
43
+
44
+ # Return
45
+ end
46
+
47
+ # =============================================================
48
+ end
49
+ # =============================================================
50
+ end
51
+ end
@@ -0,0 +1,43 @@
1
+ module Drakkon
2
+ module Gems
3
+ # General Helpers for Gem Class
4
+ module GemHelpers
5
+ def source_setup
6
+ @source = source?(args.shift).to_sym
7
+
8
+ case source
9
+ when :local
10
+ data[:path] = path?(args.shift)
11
+ # Using Name within package
12
+ # @id = "#{source}--#{data[:path]}"
13
+ end
14
+ end
15
+
16
+ def source?(source)
17
+ return source if sources.include?(source)
18
+
19
+ prompt.select('Gem Source?', sources, filter: true)
20
+ end
21
+
22
+ def sources
23
+ [
24
+ 'local'
25
+ ]
26
+ end
27
+
28
+ def path?(path)
29
+ return path unless path.nil?
30
+
31
+ loop do
32
+ dir = prompt.ask('Local Path? (e.g. /data/gem/location)')
33
+
34
+ return dir if File.directory?(dir)
35
+
36
+ LogBot.fatal('Gem', "Invalid Directory / Not found! #{dir.pastel(:red)}")
37
+ end
38
+ end
39
+ # =============================================================
40
+ end
41
+ # =============================================================
42
+ end
43
+ end
@@ -0,0 +1,24 @@
1
+ module Drakkon
2
+ module Gems
3
+ # Run Command for CLI
4
+ module Install
5
+ def self.opts
6
+ @opts
7
+ end
8
+
9
+ def self.start(args)
10
+ gem = Gems::Gem.new
11
+ gem.intall_setup(args)
12
+ rescue TTY::Reader::InputInterrupt
13
+ exit 0
14
+ end
15
+
16
+ def self.prompt
17
+ TTY::Prompt.new(active_color: :cyan)
18
+ end
19
+
20
+ #=======================================================
21
+ end
22
+ #=======================================================
23
+ end
24
+ end
@@ -0,0 +1,85 @@
1
+ module Drakkon
2
+ # Run Command for CLI
3
+ module Init
4
+ # General Run
5
+ def self.go!(_raw = nil)
6
+ if Settings.init?
7
+ LogBot.info('Init', 'Already Configured!')
8
+ exit(0)
9
+ end
10
+
11
+ run!
12
+ rescue SystemExit, Interrupt
13
+ LogBot.info('Init', 'Exiting')
14
+ exit
15
+ end
16
+
17
+ def self.run!
18
+ exit if prompt.no?("Init Drakkon here? #{Dir.pwd.pastel(:yellow)}")
19
+ LogBot.info('Init', 'Start')
20
+ settings
21
+ directories
22
+ metadata
23
+
24
+ # TODO: Validate / Confirm
25
+ File.write('app/main.rb', main_tick)
26
+ end
27
+
28
+ def self.metadata
29
+ # Icon is required for build
30
+ FileUtils.cp(metdata_dir('icon.png'), 'metadata/')
31
+
32
+ # Copy metdata files
33
+ FileUtils.cp(metdata_dir('game_metadata.txt'), 'metadata/')
34
+ end
35
+
36
+ def self.metdata_dir(file_name = nil)
37
+ "#{Run.version_dir}/mygame/metadata/#{file_name}"
38
+ end
39
+
40
+ def self.settings
41
+ LogBot.info('Init', 'Settings Setup')
42
+
43
+ opts = {
44
+ platforms: [],
45
+ version: Hub.version_latest,
46
+ image_index: true,
47
+ manifest: true,
48
+ gems: {}
49
+ }
50
+
51
+ # TODO: Be better, this is lazy...
52
+ opts.each do |key, value|
53
+ Settings.update(key, value)
54
+ end
55
+ end
56
+
57
+ def self.directories
58
+ LogBot.info('Init', 'Directories Setup')
59
+
60
+ ['app', 'fonts', 'metadata', 'fonts', 'sounds', 'sprites', 'app/drakkon'].each do |dir|
61
+ next if Dir.exist?(dir)
62
+
63
+ Dir.mkdir dir
64
+ end
65
+ end
66
+
67
+ def self.main_tick
68
+ <<~MAIN
69
+ require 'app/drakkon/bundle.rb'
70
+
71
+ def tick(gtk_args)
72
+ # args.gtk.slowmo! 2
73
+ # =========================================================
74
+ end
75
+ MAIN
76
+ end
77
+
78
+ def self.prompt
79
+ TTY::Prompt.new(active_color: :cyan)
80
+ end
81
+
82
+ #=======================================================
83
+ end
84
+ #=======================================================
85
+ end
@@ -0,0 +1,112 @@
1
+ module Drakkon
2
+ # General Info Helpers
3
+ module Hub
4
+ # Ensrue Setup
5
+ def self.init
6
+ # rubocop:disable Lint/NonAtomicFileOperation
7
+ # Ensure Home Directory; It is neccessary stupid rubocop
8
+ Dir.mkdir(Hub.dir) unless Dir.exist?(Hub.dir)
9
+ # rubocop:enable Lint/NonAtomicFileOperation
10
+
11
+ setup unless File.exist?(config_file)
12
+ end
13
+
14
+ def self.setup
15
+ LogBot.info('Hub', 'Init Config')
16
+ opts = config_defaults
17
+
18
+ # TODO: Be better, this is lazy...
19
+ opts.each do |key, value|
20
+ Hub.update(key, value)
21
+ end
22
+ end
23
+
24
+ def self.config_defaults
25
+ {
26
+ versions: [],
27
+ skeletons: {}
28
+ }
29
+ end
30
+
31
+ # Combine Dir Location
32
+ def self.dir
33
+ "#{Dir.home}/.drakkon"
34
+ end
35
+
36
+ def self.config_file
37
+ "#{dir}/config.json"
38
+ end
39
+
40
+ def self.version?(version)
41
+ versions.include? version
42
+ end
43
+
44
+ def self.versions
45
+ config.versions
46
+ end
47
+
48
+ def self.version_latest
49
+ list = versions.map { |v| v.split('.').map(&:to_i) }
50
+ latest = list.sort.reverse.max
51
+ latest.join('.')
52
+ end
53
+
54
+ def self.versions_sorted
55
+ list = versions.map { |v| v.split('.').map(&:to_i) }
56
+ list.sort.reverse.map { |v| v.join('.') }
57
+ end
58
+
59
+ def self.version_add(version)
60
+ config[:versions].push version
61
+
62
+ update(:versions, config[:versions])
63
+ end
64
+
65
+ def self.config
66
+ # Write Default
67
+ File.write(config_file, Oj.dump({})) unless File.exist?(config_file)
68
+
69
+ @config ||= JSON.parse(File.read(config_file), { symbolize_names: true })
70
+
71
+ # TODO: Optimize this a bit more
72
+ config_defaults.each do |key, value|
73
+ @config[key] ||= value
74
+ end
75
+
76
+ @config
77
+ end
78
+
79
+ def self.update(key, value)
80
+ config[key] = value
81
+ write
82
+ end
83
+
84
+ def self.delete(key)
85
+ config.delete key
86
+ write
87
+ end
88
+
89
+ def self.write
90
+ # LogBot.debug('Hub', "Writing Config: #{config_file}")
91
+ File.write(config_file, Oj.dump(config))
92
+ end
93
+
94
+ def self.log_file
95
+ "#{dir}/output.log"
96
+ end
97
+
98
+ # =========================
99
+ # Template Helpers
100
+ # =========================
101
+ def self.skeletons?
102
+ !config.skeletons.empty?
103
+ end
104
+
105
+ def self.skeletons
106
+ config.skeletons
107
+ end
108
+
109
+ # ======================================================================
110
+ end
111
+ # ======================================================================
112
+ end
@@ -0,0 +1,43 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module Biggest
5
+ def self.run!(_args = [])
6
+ start
7
+ end
8
+
9
+ def self.start
10
+ index = []
11
+ LogBot.info('Image Biggest Index')
12
+ images.each do |img|
13
+ index.push process(img)
14
+ end
15
+
16
+ w = index.max_by(&:w).w
17
+ h = index.max_by(&:h).h
18
+
19
+ puts "Largest Size is: { w: #{w}, h: #{h} }"
20
+ end
21
+
22
+ def self.process(file)
23
+ # LogBot.info('Image Biggest', file)
24
+ img = MiniMagick::Image.open(file)
25
+
26
+ {
27
+ w: img.width,
28
+ h: img.height
29
+ }
30
+ end
31
+
32
+ def self.images
33
+ Dir["#{Dir.pwd}/**/*.png"]
34
+ end
35
+
36
+ def self.prompt
37
+ TTY::Prompt.new(active_color: :cyan)
38
+ end
39
+ # =========================================================
40
+ end
41
+ # =========================================================
42
+ end
43
+ end
@@ -0,0 +1,76 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module Blur
5
+ def self.run!(args = [])
6
+ # Sizing
7
+ size = if args.empty?
8
+ prompt.ask('Blur Size? (e.g. 20x20): ', default: '5x5')
9
+ else
10
+ args.shift
11
+ end
12
+
13
+ # TODO: Recommend as Options
14
+ # TODO: Blur Options
15
+
16
+ # Potentially Support Custom Filters?
17
+ filter = if args.empty?
18
+ 'Gaussian'
19
+ else
20
+ args.shift
21
+ end
22
+
23
+ puts <<~HELP
24
+ Usage [size] [filter = Gaussian]
25
+ - Run in the directory you wish to modify the images
26
+ - Blurs the images via MiniMagick
27
+
28
+ Filter: #{filter} to Size: #{size}
29
+ Current Directory;
30
+ #{Dir.pwd.pastel(:yellow)}
31
+
32
+ Images:
33
+ HELP
34
+
35
+ images.sort.each do |img|
36
+ img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
37
+ puts " - #{img_s}"
38
+ end
39
+ puts
40
+
41
+ exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Blur!? #{'(Destructive)'.pastel(:red)}"
42
+
43
+ start(filter, size)
44
+ end
45
+
46
+ def self.start(filter, size)
47
+ images.each do |img|
48
+ LogBot.info('Image Blur', img)
49
+ process(img, filter, size)
50
+ end
51
+ end
52
+
53
+ def self.process(file, filter, size)
54
+ image = MiniMagick::Image.open(file)
55
+
56
+ # Ignore if the same
57
+ return if image.width == size.split('x', 2).first.to_i
58
+
59
+ LogBot.info('Image Blur', "Blurring: #{file}")
60
+ image.filter filter
61
+ image.blur size
62
+ image.write file
63
+ end
64
+
65
+ def self.images
66
+ Dir["#{Dir.pwd}/**/*.png"]
67
+ end
68
+
69
+ def self.prompt
70
+ TTY::Prompt.new(active_color: :cyan)
71
+ end
72
+ # =========================================================
73
+ end
74
+ # =========================================================
75
+ end
76
+ end
@@ -0,0 +1,86 @@
1
+ module Drakkon
2
+ module Images
3
+ # This renames png's in a directory to match the index_frame 0..10 etc
4
+ module BulkRename
5
+ def self.run!(args = [])
6
+ args ||= []
7
+ sort_method = if args.empty?
8
+ :mtime
9
+ else
10
+ args.shift.to_sym
11
+ end
12
+
13
+ # Lazy Safety
14
+ sort_method = :mtime unless %i[name mtime].include?(sort_method)
15
+
16
+ puts <<~HELP
17
+ Usage [sort_method = mtime, name]
18
+ - Run in the directory you wish to rename the images (uses mtime)
19
+
20
+ Current Directory;
21
+ #{Dir.pwd.pastel(:yellow)}
22
+
23
+ Images:
24
+ HELP
25
+
26
+ list = sorted_images(sort_method)
27
+
28
+ list.each do |img|
29
+ img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
30
+ puts " - #{img_s}"
31
+ end
32
+ puts
33
+
34
+ exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Rename!? #{'(Destructive)'.pastel(:red)}"
35
+
36
+ start(list)
37
+ end
38
+
39
+ def self.start(list)
40
+ # Create tmp_dir to send stuff too
41
+ Dir.mktmpdir do |tmp_dir|
42
+ # Move / rename all out into tmp_dir to avoid clobbering
43
+ list.each_with_index do |f, i|
44
+ FileUtils.mv(f, "#{tmp_dir}/#{i}.png")
45
+ end
46
+
47
+ # Move all back
48
+ Dir["#{tmp_dir}/*.png"].each do |f|
49
+ FileUtils.mv(f, Dir.pwd)
50
+ end
51
+ end
52
+ end
53
+
54
+ def self.sorted_images(sort_method)
55
+ case sort_method
56
+ when :mtime then images.sort_by { |x| File.mtime(x) }
57
+ when :name then images.sort_by { |x| File.basename(x) }
58
+ end
59
+ end
60
+
61
+ def self.process(file, filter, size)
62
+ image = MiniMagick::Image.open(file)
63
+
64
+ # Ignore if the same for w/h
65
+ return if image.width == size.split('x', 2).first.to_i && image.height == size.split('x', 2).last.to_i
66
+
67
+ LogBot.info('Image Resize', "Resizing: #{file}: #{size}")
68
+ image.filter filter
69
+ image.resize size
70
+ image.write file
71
+ end
72
+
73
+ def self.images
74
+ # Dir["#{Dir.pwd}/*.png"].sort_by(&:File.basename)
75
+
76
+ Dir["#{Dir.pwd}/*.png"].sort_by { |x| File.mtime(x) }
77
+ end
78
+
79
+ def self.prompt
80
+ TTY::Prompt.new(active_color: :cyan)
81
+ end
82
+ # =========================================================
83
+ end
84
+ # =========================================================
85
+ end
86
+ end
@@ -0,0 +1,74 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module Canvas
5
+ def self.run!(args = [])
6
+ # Sizing
7
+ size = if args.empty?
8
+ prompt.ask('Size? (e.g. 200x200): ')
9
+ else
10
+ args.shift
11
+ end
12
+
13
+ gravity = if args.empty?
14
+ prompt.ask('Gravity? (west,east,north,south): ', default: 'south')
15
+ else
16
+ args.shift
17
+ end
18
+
19
+ puts <<~HELP
20
+ Usage [WxH] [gravity]
21
+ - Run in the directory you wish to modify the images
22
+ - Adjust images via MiniMagick (extent)
23
+ #{' '}
24
+
25
+ Canvas: Size: #{size}, Gravity: #{gravity}
26
+ Current Directory;
27
+ #{Dir.pwd.pastel(:yellow)}
28
+
29
+ Images:
30
+ HELP
31
+
32
+ images.sort.each do |img|
33
+ img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
34
+ puts " - #{img_s}"
35
+ end
36
+ puts
37
+
38
+ exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Canvas!? #{'(Destructive)'.pastel(:red)}"
39
+
40
+ start(size, gravity)
41
+ end
42
+
43
+ def self.start(size, gravity)
44
+ images.each do |img|
45
+ LogBot.info('Image Shift', img)
46
+ process(img, gravity, size)
47
+ end
48
+ end
49
+
50
+ def self.process(file, gravity, size)
51
+ image = MiniMagick::Image.open(file)
52
+ LogBot.info('Image Canvas', file)
53
+
54
+ img = image.combine_options do |cmd|
55
+ cmd.gravity gravity
56
+ cmd.background 'transparent'
57
+ cmd.extent size
58
+ end
59
+
60
+ img.write file
61
+ end
62
+
63
+ def self.images
64
+ Dir["#{Dir.pwd}/**/*.png"]
65
+ end
66
+
67
+ def self.prompt
68
+ TTY::Prompt.new(active_color: :cyan)
69
+ end
70
+ # =========================================================
71
+ end
72
+ # =========================================================
73
+ end
74
+ end