mirror of
https://github.com/hkalexling/Mango.git
synced 2025-08-02 10:55:30 -04:00
133 lines
3.6 KiB
Crystal
133 lines
3.6 KiB
Crystal
require "./config"
|
|
require "./queue"
|
|
require "./server"
|
|
require "./main_fiber"
|
|
require "./mangadex/*"
|
|
require "./plugin/*"
|
|
require "option_parser"
|
|
require "clim"
|
|
require "tallboy"
|
|
|
|
MANGO_VERSION = "0.18.3"
|
|
|
|
# From http://www.network-science.de/ascii/
|
|
BANNER = %{
|
|
|
|
_| _|
|
|
_|_| _|_| _|_|_| _|_|_| _|_|_| _|_|
|
|
_| _| _| _| _| _| _| _| _| _| _|
|
|
_| _| _| _| _| _| _| _| _| _|
|
|
_| _| _|_|_| _| _| _|_|_| _|_|
|
|
_|
|
|
_|_|
|
|
|
|
|
|
}
|
|
|
|
DESCRIPTION = "Mango - Manga Server and Web Reader. Version #{MANGO_VERSION}"
|
|
|
|
macro common_option
|
|
option "-c PATH", "--config=PATH", type: String,
|
|
desc: "Path to the config file"
|
|
end
|
|
|
|
macro throw(msg)
|
|
puts "ERROR: #{{{msg}}}"
|
|
puts
|
|
puts "Please see the `--help`."
|
|
exit 1
|
|
end
|
|
|
|
class CLI < Clim
|
|
main do
|
|
desc DESCRIPTION
|
|
usage "mango [sub_command] [options]"
|
|
help short: "-h"
|
|
version "Version #{MANGO_VERSION}", short: "-v"
|
|
common_option
|
|
run do |opts|
|
|
puts BANNER
|
|
puts DESCRIPTION
|
|
puts
|
|
|
|
# empty ARGV so it won't be passed to Kemal
|
|
ARGV.clear
|
|
|
|
Config.load(opts.config).set_current
|
|
|
|
# Initialize main components
|
|
Storage.default
|
|
Queue.default
|
|
Library.default
|
|
MangaDex::Downloader.default
|
|
Plugin::Downloader.default
|
|
|
|
spawn do
|
|
Server.new.start
|
|
end
|
|
|
|
MainFiber.start_and_block
|
|
end
|
|
|
|
sub "admin" do
|
|
desc "Run admin tools"
|
|
usage "mango admin [tool]"
|
|
help short: "-h"
|
|
run do |opts|
|
|
puts opts.help_string
|
|
end
|
|
sub "user" do
|
|
desc "User management tool"
|
|
usage "mango admin user [arguments] [options]"
|
|
help short: "-h"
|
|
argument "action", type: String,
|
|
desc: "Action to perform. Can be add/delete/update/list"
|
|
argument "username", type: String,
|
|
desc: "Username to update or delete"
|
|
option "-u USERNAME", "--username=USERNAME", type: String,
|
|
desc: "Username"
|
|
option "-p PASSWORD", "--password=PASSWORD", type: String,
|
|
desc: "Password"
|
|
option "-a", "--admin", desc: "Admin flag", type: Bool, default: false
|
|
common_option
|
|
run do |opts, args|
|
|
Config.load(opts.config).set_current
|
|
storage = Storage.new nil, false
|
|
|
|
case args.action
|
|
when "add"
|
|
throw "Options `-u` and `-p` required." if opts.username.nil? ||
|
|
opts.password.nil?
|
|
storage.new_user opts.username.not_nil!,
|
|
opts.password.not_nil!, opts.admin
|
|
when "delete"
|
|
throw "Argument `username` required." if args.username.nil?
|
|
storage.delete_user args.username
|
|
when "update"
|
|
throw "Argument `username` required." if args.username.nil?
|
|
username = opts.username || args.username
|
|
password = opts.password || ""
|
|
storage.update_user args.username, username.not_nil!,
|
|
password.not_nil!, opts.admin
|
|
when "list"
|
|
users = storage.list_users
|
|
table = Tallboy.table do
|
|
header ["username", "admin access"]
|
|
users.each do |name, admin|
|
|
row [name, admin]
|
|
end
|
|
end
|
|
puts table
|
|
when nil
|
|
puts opts.help_string
|
|
else
|
|
throw "Unknown action \"#{args.action}\"."
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
CLI.start(ARGV)
|