#!/bin/bash
# made by hazukie
# date: 2024.4.13
# JUST FOR LEARNING PURPOSES, DON'T USE THIS TO CRACK SOFTWARE.
# 只是出于学习目的，请勿将其用于破解软件，否则后果自负。用户行为均与本项目作者无关！

#####################################
####	    函数配置部分	####
####################################
# 打印警告日志
warning() {
    printf "\033[31m-> $*\n\033[0m"
}

# 打印日志
infos() {
    printf "\033[32m=> $*\n\033[0m"
}

# 捕获 Ctrl+C 中断键
trap 'onCtrlC' INT
function onCtrlC() {
	printf "\n"
	warning "触发 Ctrl+C,已中止当前脚本运行..."
	exit 0
}

# 提示高危命令执行
check_dangerous_cmd(){
	warning "即将执行 $*"
	warning "是否确认执行高危命令? (y/n)"
	read -p "-> " -r dcheck
	if [[ "${dcheck:0:1}" != "y" ]];then
		warning "已取消执行高危命令,程序中止退出..."
		exit 1 
	else
		infos "正在执行高危命令 $*"
	fi
}

# 询问函数:
#	调用函数后通过 ret 变量获取返回值,
function ask(){
	infos "$*"
	read -p "-> " -r content
	until [[ ! -z "$content" ]];
	do
		infos "$*"
		read -p "-> " -r content
	done
	ret=""
	ret="$content"
}


check_typora_installed_path(){
	warning "该脚本包含 sudo 指令,请您确保知悉高危命令执行的后果且承担相关代价"
	warning "在执行過程中，请您仔细确认相关提示，当提示「即将执行高危命令」时，那么此种情形将考验您的判断力"
	infos "Typora 安装路径: $*"
	warning "Typora 安装路径是否正确?(y/n)"
	ret="$*"
	read -p "-> " -r check
	if [[ "${check:0:1}" != "y" ]];then
		ask "不正确的话你可以尝试输入新的路径:"
		infos "已确认当前安装路径为: $ret\n"
	fi
}


# 判断 node 是否安装
check_node(){
	warning "检测是否存在 node..."
	if ! type node >/dev/null 2>&1;then
		warning "未找到 node..."
		exit 0
	else
		infos "node 存在\n"
	fi
}

# 判断文件是否存在
file_exist() {
    if [ -e "$1" ]; then
	infos "checking $* is exist..."
        ret=1
    else
	warning "checking $* is non-exist..."
        ret=0
    fi
}

#注入数据
write_js2file() {
	cat "$CUR_HOOK_JS_PATH">"$HOOK_JS_WRITE_PATH"
}


# 给目的文件中追加一行 "require('./hook')",
# 实现在 Typora 运行时调用注入JS文件
append_require2file() {
    echo -e "\nrequire('./hook')">> "$CUR_INJECT_JS_PATH"
}

#前置准备工作
mkinit(){
	# 检查相关文件夹是否存在
	file_exist "$CUR_INJECT_JS_DIR_PATH"
	if [ "$ret" == "1" ]; then
		warning "您可能已经注入过 hook 文件了！\n警告：在当前目录下发现 node 文件夹"
    		infos "您若不确定之前是否注入过该文件的话，请手动删除当前目录下的 node 文件夹($CUR_INJECT_JS_DIR_PATH)！\n"
    		infos "您可以有以下选择："
    		infos "\t 1. 删除目录"
    		warning "\t\trm $CUR_INJECT_JS_DIR_PATH -r\n"
    		infos "\t 2. 复制已注入压缩包(已确认)至 $INJECT_JS_DIR_ASAR_PATH"
    		warning "\t\tsudo cp $CUR_PACKED_ASAR_PATH $INJECT_JS_DIR_ASAR_PATH"
    		exit 0
	fi
	file_exist "$INJECT_JS_DIR_ASAR_PATH"
	if [ "$ret" == "1" ]; then
	    # 检查 node 是否存在
	    check_node
	    
	    # 复制 asar 文件至当前项目 build 下
	    infos "复制 node_modules 至 当前目录下($(pwd)/build)"
	    check_dangerous_cmd "sudo cp $INJECT_JS_DIR_ASAR_PATH $CUR_INJECT_ASAR_PATH"
	    sudo cp $INJECT_JS_DIR_ASAR_PATH $CUR_INJECT_ASAR_PATH
	else
		warning "未找到 node_modules.asar！"
    		warning "请确认 Typora 安装目录下是否正确，以及该安装目录下的 resources 中是否存在 node_modules.asar!"
    		exit 0
	fi
}

################## 函数配置部分 ###############




################## 数据配置部分 ###############

# 待注入数据文件路径
CUR_HOOK_JS_PATH="./src/hooklog.js"

# Typora 安装路径
TYPORA_INSTALLED_PATH="/usr/share/typora"
# 再次确认是否正确
check_typora_installed_path "$TYPORA_INSTALLED_PATH"
TYPORA_INSTALLED_PATH="$ret"

# 注入 JS 文件的待解压缩包路径
INJECT_JS_DIR_ASAR_PATH="$TYPORA_INSTALLED_PATH/resources/node_modules.asar"

# 为防止破坏原压缩包，特意复制至当前目录
if [[ ! -d ./build ]];then
	mkdir build
fi
# 当前压缩包副本路径
CUR_INJECT_ASAR_PATH="./build/node_modules.asar"

# 当前重新打包压缩包路径
CUR_PACKED_ASAR_PATH="${CUR_INJECT_ASAR_PATH}_new"

# 当前注入 JS 文件的文件夹路径
CUR_INJECT_JS_DIR_PATH="./build/node"

# 注入 JS 文件路径
HOOK_JS_WRITE_PATH="$CUR_INJECT_JS_DIR_PATH/raven/hook.js"

# 注入JS文件的目的文件路径
CUR_INJECT_JS_PATH="$CUR_INJECT_JS_DIR_PATH/raven/index.js"

# 解压缩 Asar 包的程序路径
ASAR_BIN="./asar_modules/node_modules/@electron/asar/bin/asar.js" 
################## 数据配置部分 ###############



################## 正式执行部分 ###############
# 前置工作初始化
mkinit

# 解压 asar 文件
infos "正在解压 node_modues.asar"
node $ASAR_BIN extract $CUR_INJECT_ASAR_PATH $CUR_INJECT_JS_DIR_PATH
infos "成功解压至 $(pwd)/node 文件夹中！\n"

# 添加js文件和依赖
infos "正在将 hook.js 添加至 $CUR_INJECT_JS_DIR_PATH 文件夹中..."
write_js2file
infos "正在将依赖添加到 $CUR_INJECT_JS_PATH...\n"
append_require2file
infos "添加 $CUR_HOOK_JS_PATH 成功！"
infos "在 $CUR_INJECT_JS_PATH 添加依赖成功！\n"

# 重新打包成 asar 文件
infos "正在重新打包 node 文件夹至 $CUR_PACKED_ASAR_PATH..."
node $ASAR_BIN pack $CUR_INJECT_JS_DIR_PATH $CUR_PACKED_ASAR_PATH
infos "打包完成！\n"

# 复制 asar 文件到软件处
warning "###### 正在将 $CUR_INJECT_ASAR_PATH 移动至 $INJECT_JS_DIR_ASAR_PATH ######"
check_dangerous_cmd "sudo cp $CUR_PACKED_ASAR_PATH $INJECT_JS_DIR_ASAR_PATH"
sudo cp $CUR_PACKED_ASAR_PATH $INJECT_JS_DIR_ASAR_PATH

# 善后工作
warning "若执行当前脚本后不能正常打开软件的话，则请执行以下命令还原："
warning "\tcp $CUR_INJECT_ASAR_PATH $INJECT_JS_DIR_ASAR_PATH\n"
infos "您的序列号为："
infos "\tLSGDW2-6M43UN-KHKH2A-D6FDJF"
infos "\tD9KYN9-MCCL2F-59LFPC-NK2CPX\n"
warning "如果激活失败，恐怕您还得安装 rust 环境并使用 license-gen/target/debug/license-gen 生成新的序列号"
################## 正式执行部分 ###############
