feat: add libraries

This commit is contained in:
2025-01-11 10:40:16 +08:00
parent a93fd38156
commit c041590788
4 changed files with 108 additions and 1 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
.idea/
# ---> macOS
# General
.DS_Store

View File

@@ -0,0 +1,27 @@
export function compareVersion(ver1: string, ver2: string) {
if (ver1 === ver2) { return 0; }
let ver1Parts = ver1.split(".");
let ver2Parts = ver2.split(".");
let ver1Main = parseInt(ver1Parts[0]);
let ver2Main = parseInt(ver2Parts[0]);
if (ver1Main > ver2Main) { return 1; }
if (ver1Main < ver2Main) { return -1; }
let ver1Second = parseInt(ver1Parts[1]);
let ver2Second = parseInt(ver2Parts[1]);
if (ver1Second > ver2Second) { return 1; }
if (ver1Second < ver2Second) { return -1; }
let ver1Third = parseInt(ver1Parts[2]);
let ver2Third = parseInt(ver2Parts[2]);
if (ver1Third > ver2Third) { return 1; }
if (ver1Third < ver2Third) { return -1; }
return 0;
}
export function isOn(val: string) {
let lowerVal = (val == null)? val: val.toLowerCase();
return lowerVal === "on" || lowerVal === "yes" || lowerVal === "1" || lowerVal === "true";
}
export function isEnvOn(envKey: string) {
return Deno.env.get(envKey);
}

View File

@@ -0,0 +1,79 @@
import { hmac } from "https://deno.land/x/hmac@v2.0.1/mod.ts";
async function postHttpJson(url: string, body: any) {
const resp = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
if (resp.status !== 200) {
console.error("Send HTTP POST failed", resp);
throw `Send HTTP POST to: ${url}, failed: ${resp.status}`;
}
return resp;
}
const BASE_DING_TALK_URL = "https://oapi.dingtalk.com/robot/send";
export interface SendDingTalkMessageOptions {
base_url?: string;
access_token: string;
sec_token?: string;
}
export interface DingTalkMessageAt {
atMobiles?: Array<string>;
atUserIds?: Array<string>;
isAtAll?: boolean,
}
export interface DingTalkTextMessage {
content: string;
at?: DingTalkMessageAt;
}
export interface DingTalkMarkdownMessage {
title?: string,
content: string;
at?: DingTalkMessageAt;
}
export async function sendDingTalkTextMessage(message: DingTalkTextMessage, options: SendDingTalkMessageOptions) {
return await sendDingTalkMessage({
msgtype: "text",
text: {
content: message.content,
}
}, options);
}
export async function sendDingTalkMarkdownMessage(message: DingTalkMarkdownMessage, options: SendDingTalkMessageOptions) {
return await sendDingTalkMessage({
msgtype: "markdown",
markdown: {
title: message.title || "untitled",
text: message.content,
}
}, options);
}
export async function sendDingTalkMessage(message: any, options: SendDingTalkMessageOptions) {
let send_url = options.base_url || BASE_DING_TALK_URL;
send_url += "?access_token=" + encodeURIComponent(options.access_token);
if (options.sec_token) {
const timestamp = new Date().getTime();
const timestamp_and_secret = `${timestamp}\n${options.sec_token}`;
const sec_token_sign = hmac("sha256", options.sec_token, timestamp_and_secret, "utf8", "base64");
send_url += "&timestamp=" + timestamp;
send_url += "&sign=" + encodeURIComponent(sec_token_sign);
}
const resp = await postHttpJson(send_url, message);
const send_ding_talk_resp_body = await resp.json();
if (send_ding_talk_resp_body.errcode !== 0) {
console.error("Send DingTalk message failed", send_ding_talk_resp_body);
throw `Send DingTalk message failed: ${send_ding_talk_resp_body.errcode}`;
}
}

View File

@@ -40,7 +40,7 @@ fn main() -> XResult<()> {
debugging!("Skip none dir: {}", script_dir);
continue;
}
if /*"update-meta-rs" == script_dir ||*/ script_dir.starts_with(".") {
if "libraries" == script_dir || script_dir.starts_with(".") {
debugging!("Skip update meta rs: {}", script_dir);
continue;
}