From c26c81b484479a896ff10255faa502ee5bafd2d7 Mon Sep 17 00:00:00 2001 From: YM Date: Fri, 10 May 2019 17:45:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WeChatExtension/Rely/OnLineUpdate/main.sh | 36 +++ .../Rely/OnLineUpdate/onLineUpdate.sh | 288 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 33980 -> 33851 bytes 3 files changed, 324 insertions(+) create mode 100755 WeChatExtension/Rely/OnLineUpdate/main.sh create mode 100755 WeChatExtension/Rely/OnLineUpdate/onLineUpdate.sh diff --git a/WeChatExtension/Rely/OnLineUpdate/main.sh b/WeChatExtension/Rely/OnLineUpdate/main.sh new file mode 100755 index 00000000..0718f391 --- /dev/null +++ b/WeChatExtension/Rely/OnLineUpdate/main.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +omw_str="omw" +bin_dir="/usr/local/bin" +soft_link_file="${bin_dir}/${omw_str}" +omw_work_dir="${HOME}/.oh_my_wechat" +omw_bin_file="${omw_work_dir}/${omw_str}" + +# 请求 bin 目录的写入权限 +if [[ ! -w ${bin_dir} ]]; then +echo "为了安装 Oh My WeChat,请输入密码 :" +sudo chown $(whoami) ${bin_dir} +fi + +# 创建工作目录 +if [[ ! -e ${omw_work_dir} ]]; then +mkdir ${omw_work_dir} +fi + +echo "开始下载 Oh My WeChat..." +# 从 GitHub 上下载脚本 +curl --retry 2 -o ${omw_bin_file} https://raw.githubusercontent.com/lmk123/oh-my-wechat/master/main.sh +# 本地开发时直接将文件复制过去 +#cp ./main.sh ${omw_bin_file} + +if [[ 0 -eq $? ]]; then +# 给 omw 添加执行权限 +chmod 755 ${omw_bin_file} +# 创建一个到 /usr/local/bin/omw 的软链 +ln -sf ${omw_bin_file} ${soft_link_file} +echo "成功安装 Oh My Wechat!即将安装微信小助手……" +${omw_bin_file} -n +else +echo "下载 Oh My WeChat 时失败,请稍后重试。" +exit 1 +fi diff --git a/WeChatExtension/Rely/OnLineUpdate/onLineUpdate.sh b/WeChatExtension/Rely/OnLineUpdate/onLineUpdate.sh new file mode 100755 index 00000000..99b9bfeb --- /dev/null +++ b/WeChatExtension/Rely/OnLineUpdate/onLineUpdate.sh @@ -0,0 +1,288 @@ +#!/usr/bin/env bash + +echo_with_date() { +echo "[`date '+%H:%M:%S'`]" $1 +} + +# select 提示语 +PS3='你的选择:' + +# 微信 app 的位置 +wechat_path="/Applications/WeChat.app" + +# 没有安装微信则退出 +if [[ ! -d ${wechat_path} ]]; then +wechat_path="/Applications/微信.app" +if [[ ! -d ${wechat_path} ]]; then +echo_with_date "应用程序文件夹中未发现微信,请检查微信是否有重命名或者移动路径位置" +exit +fi +fi + +# 执行命令时的工作目录 +initial_pwd=$(pwd) + +# omw 的工作目录 +work_dir="${HOME}/.oh_my_wechat" + +# 切换到 omw 的工作目录,可以避免后面的所有操作都需要指定 omw 的工作目录 +cd ${work_dir} + +# 记录小助手的版本的文件地址,同时也可以用来判断小助手有没有被安装 +version_plist_path="${wechat_path}/Contents/MacOS/WeChatExtension.framework/Resources/Info.plist" + +# 已经下载过的安装包版本,同时当微信自动更新导致小助手被删除时,作为上一次安装过的版本号使用 +downloaded_version=$(find . -maxdepth 1 -type d -name 'WeChatExtension-MacOS-*' -print -quit | grep -o '\d\{1,\}\.\d\{1,\}\.\d\{1,\}') + +# 用 current_version 记录小助手的当前版本 +if [[ -f ${version_plist_path} ]]; then +current_version=$(awk '/CFBundleShortVersionString<\/key>/,/.*<\/string>/' ${version_plist_path} | grep -o '\d\{1,\}\.\d\{1,\}\.\d\{1,\}') +echo_with_date "当前微信小助手版本为 v${current_version}" +else +echo_with_date "当前没有安装微信小助手" +fi + +# 判断微信是否正在运行 +is_wechat_running=$(ps aux | grep [W]eChat.app | wc -l) +# 删掉前面的空白 +is_wechat_running="${is_wechat_running#"${is_wechat_running%%[![:space:]]*}"}" +# 删掉后面的空白 +is_wechat_running="${is_wechat_running%"${is_wechat_running##*[![:space:]]}"}" + +# 下载指定版本的小助手 +download() { +if [[ ! -e "WeChatPlugin-MacOS-${1}" ]]; then +# 第二个参数作为要打印的消息 +if [[ -n ${2} ]]; then +echo_with_date ${2} +fi +echo_with_date "开始下载微信小助手 v${1}……" +echo_with_date "如果下载速度很慢,建议通过其它方式下载安装包,然后使用 omw load 命令导入" +echo_with_date "详情请参阅文档 https://github.com/lmk123/oh-my-wechat#omw-load" +# 下载压缩包 +curl --retry 2 -L -o ${1}.zip https://github.com/MustangYM/WeChatExtension-ForMac/raw/master/WeChatExtension/Rely/Plugin/v${1}.zip +if [[ 0 -eq $? ]]; then +# 解压为同名文件夹 +unzip -o -q ${1}.zip +# 删除压缩包 +rm ${1}.zip +echo_with_date "下载完成" +else +echo_with_date "下载失败,请稍后重试。" +exit 1 +fi +fi +} + +plist_path="${HOME}/Library/LaunchAgents/cn.limingkai.oh-my-wechat.plist" + +open_auto_start() { +cat > ${plist_path} < + + + +Label +cn.limingkai.oh-my-wechat +ProgramArguments + +/usr/local/bin/omw +silent +${1} + +RunAtLoad + + + +EOL +echo_with_date "已开启开机自启动" +} + +close_auto_start() { +if [[ -e ${plist_path} ]]; then +rm ${plist_path} +echo_with_date "已关闭开机自启动" +else +echo_with_date "当前没有开启开机自启动" +fi +} + +# 卸载 Oh My WeChat +uninstall_omw() { +# 删除开启自启动配置文件 +close_auto_start +# 删除软链 +rm -f /usr/local/bin/omw +# 删除工作目录 +rm -rf ${work_dir} +echo_with_date "Oh My WeChat 卸载完成" +} + +# 卸载小助手 +uninstall_plugin() { +if [[ -n ${current_version} ]]; then +# 确保有当前版本的小助手安装包 +download ${current_version} "卸载小助手时需要先下载小助手的安装包" +# 运行卸载脚本 +./WeChatPlugin-MacOS-${current_version}/Other/Uninstall.sh +echo_with_date "微信小助手卸载完成" +if [[ ${is_wechat_running} != "0" ]]; then +echo_with_date "检测到微信正在运行,需要重启微信才能关闭小助手" +fi +else +echo_with_date "当前没有安装微信小助手,无需卸载" +fi +} + +# 安装小助手 +install() { +######################################################################################## +# 没有设置 -n 参数(默认) 设置了 -n 参数 +# 已安装小助手 查询最新版本,如果跟当前版本不一样,则更新 啥都不做 +# 没有安装小助手 判断有无本地安装包 判断有无本地安装包 +# +# 有本地安装包 查询最新版本,直接安装 直接安装本地安装包 +# 没有本地安装包 查询最新版本,直接安装 查询最新版本,直接安装 +######################################################################################### +if [[ $1 == "-n" ]] && [[ -n ${current_version} ]]; then +echo_with_date "已安装微信小助手且使用了 -n 参数,无需检查更新" +return +elif [[ $1 == "-n" ]] && [[ -n ${downloaded_version} ]]; then +echo_with_date "未安装微信小助手,由于使用了 -n 参数,将直接安装已下载的版本 v${downloaded_version}" +_version=${downloaded_version} +else +if [[ $1 == "-n" ]] && [[ -z ${downloaded_version} ]]; then +echo_with_date "未安装微信小助手,也没有下载过安装包,所以即使使用了 -n 参数,仍需要检查并下载新版本" +fi +echo_with_date "正在查询新版本……" +latest_version=$(curl --retry 2 -I -s https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/latest | grep Location | sed -n 's/.*\/v\(.*\)/\1/p') +if [[ -z "$latest_version" ]]; then +echo_with_date "查询新版本时失败,请稍后重试" +exit 1 +else +latest_version=${latest_version//$'\r'/} +echo_with_date "微信小助手的最新版本为 v${latest_version}" +fi +_version=${latest_version} +fi + +if [[ ${current_version} == ${_version} ]]; then +echo_with_date "当前已经安装了最新版本的小助手,无需重新安装" +else +# 下载要安装的版本 +download ${_version} + +# 删除之前已经下载(一般是旧版本)的安装包 +if [[ ! -z ${downloaded_version} ]] && [[ ${_version} != ${downloaded_version} ]]; then +rm -rf ./WeChatPlugin-MacOS-${downloaded_version} +echo_with_date "已删除 v${downloaded_version} 的安装包" +fi + +echo_with_date "开始安装微信小助手……" +./WeChatPlugin-MacOS-${_version}/Other/Install.sh +echo_with_date "微信小助手安装完成。" +installed="1" +fi +} + +open_wechat() { +if [[ -n "$installed" ]] && [[ ${is_wechat_running} != "0" ]]; then +echo_with_date "检测到微信正在运行,请重启微信让小助手生效。" +else +echo_with_date "打开微信" +open ${wechat_path} +fi +} + +# omw silent [-o] +if [[ $1 == "silent" ]]; then +install -n +# 判断是否要自动打开微信 +if [[ $2 == "-o" ]]; then +open_wechat +fi +exit 0 +fi + +# omw open +if [[ $1 == "open" ]]; then +echo_with_date "安装完微信小助手后是否打开微信?" +options=("是" "否") +select opt in "${options[@]}" +do +case ${opt} in +"是") +_is_open="-o" +break +;; +"否") +break +;; +*) +echo_with_date "无效的选择" +;; +esac +done +open_auto_start ${_is_open} +exit 0 +fi + +# omw close +if [[ $1 == "close" ]]; then +close_auto_start +exit 0 +fi + +# omw load [version] +if [[ $1 == "load" ]]; then +_file_name="WeChatPlugin-MacOS-${2}.zip" +_file_path="${initial_pwd}/${_file_name}" +if [[ -e ${_file_path} ]]; then +# 解压到工作目录下 +unzip -o -q ${_file_path} +echo_with_date "成功导入微信小助手 v${2} 的安装包" + +# 删除已有的安装包 +if [[ ! -z ${downloaded_version} ]] && [[ ${2} != ${downloaded_version} ]]; then +rm -rf "./WeChatPlugin-MacOS-${downloaded_version}" +echo_with_date "已删除 v${downloaded_version} 的安装包" +fi +else +echo_with_date "文件 ${_file_name} 不存在" +fi +exit 0 +fi + +# omw un +if [[ $1 == "un" ]]; then +options=("微信小助手" "Oh My WeChat" "两个都卸载" "取消") +echo_with_date "你想卸载哪一个?" +select opt in "${options[@]}" +do +case ${opt} in +"微信小助手") +uninstall_plugin +break +;; +"Oh My WeChat") +uninstall_omw +break +;; +"两个都卸载") +uninstall_plugin +uninstall_omw +break +;; +"取消") +break +;; +*) +echo_with_date "无效的选择" +;; +esac +done +exit 0 +fi + +install $1 +open_wechat diff --git a/WeChatExtension/WeChatExtension.xcworkspace/xcuserdata/YanMao.xcuserdatad/UserInterfaceState.xcuserstate b/WeChatExtension/WeChatExtension.xcworkspace/xcuserdata/YanMao.xcuserdatad/UserInterfaceState.xcuserstate index 887d8b055e970e4978abdcd816e7475adba2dc9f..27983e21ac390c296f43861668b136ad64be3021 100644 GIT binary patch delta 10054 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 Y-kaWES}S+}w0<(hA4-BBKD@vF56UXdlK=n! delta 10268 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