koishi-plugin-oni-sync-bot 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +50 -36
- package/package.json +1 -1
- package/lib/config/index.d.ts +0 -15
- package/lib/sync/imgSync.d.ts +0 -30
- package/lib/sync/moduleSync.d.ts +0 -21
- package/lib/sync/pageSync.d.ts +0 -30
- package/lib/utils/login.d.ts +0 -8
- package/lib/utils/tools.d.ts +0 -20
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineComponent as p,resolveComponent as
|
|
1
|
+
import{defineComponent as d,ref as p,watch as i,onMounted as g,resolveComponent as v,openBlock as m,createBlock as y,withCtx as h,createElementVNode as u,createElementBlock as _,Fragment as k,renderList as x,toDisplayString as B}from"vue";import{store as C,Time as T}from"@koishijs/client";const b="yyyy-MM-dd hh:mm:ss",M=d({__name:"page",setup(n){const t=p(),o=p([]);function s(e){const r=T.template(b,new Date(e.timestamp)),l=e.type.toUpperCase(),a=e.content.replace(/\u001b\[[0-9;]*m/g,"");return`[${r}] [${l}] ${a}`}i(()=>C.logs,e=>{if(!e)return;const r=e.filter(l=>l.name==="oni-sync").slice(-100).map(s);o.value=r},{deep:true,immediate:true});const c=()=>{t.value&&(t.value.scrollTop=t.value.scrollHeight)};return i(()=>o.value.length,()=>{setTimeout(c,0)}),g(()=>{c()}),(e,r)=>{const l=v("k-layout");return m(),y(l,null,{default:h(()=>[u("div",{class:"log-container",ref_key:"scrollRef",ref:t},[(m(true),_(k,null,x(o.value,(a,f)=>(m(),_("div",{key:f,class:"log-line"},[u("pre",null,B(a),1)]))),128))],512)]),_:1})}}}),R=(n,t)=>{const o=n.__vccOpts||n;for(const[s,c]of t)o[s]=c;return o},$=R(M,[["__scopeId","data-v-46bc7bec"]]),E=n=>{n.page({name:"同步机器人",path:"/onilogs",component:$})};export{E as default};
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
.log-container[data-v-46bc7bec]{width:100%;height:100%;overflow-y:auto;padding:12px;font-family:monospace;background:#1e1e1e;color:#d4d4d4}.log-line[data-v-46bc7bec]{line-height:1.5;font-size:13px}pre[data-v-46bc7bec]{margin:0;font-family:inherit;white-space:pre-wrap;word-break:break-all}.break-all{word-break:break-all}
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -46,15 +46,9 @@ var import_mwn = require("mwn");
|
|
|
46
46
|
var import_koishi = require("koishi");
|
|
47
47
|
var import_pinyin_pro = require("pinyin-pro");
|
|
48
48
|
var CROSS_SITE_LINK_REGEX = /\[\[(en|ru|pt-br):[^\]]*\]\]/g;
|
|
49
|
-
var DEV_TEXT_REGEX = /Dev:/g;
|
|
50
|
-
var MODULE_NAMESPACE_PREFIX = "Module:Dev/";
|
|
51
49
|
function clean_page_text(text) {
|
|
52
50
|
const textWithoutCrossLink = text.replace(CROSS_SITE_LINK_REGEX, "");
|
|
53
|
-
|
|
54
|
-
DEV_TEXT_REGEX,
|
|
55
|
-
MODULE_NAMESPACE_PREFIX
|
|
56
|
-
);
|
|
57
|
-
return textWithReplacedDev;
|
|
51
|
+
return textWithoutCrossLink;
|
|
58
52
|
}
|
|
59
53
|
__name(clean_page_text, "clean_page_text");
|
|
60
54
|
async function getAndProcessPageContent(site, pageTitle) {
|
|
@@ -755,10 +749,10 @@ var Config = import_koishi5.Schema.object({
|
|
|
755
749
|
huijiUAKey: import_koishi5.Schema.string().description("灰机wiki UAKey").default("${{ env.huijiUAKey }}"),
|
|
756
750
|
domain: import_koishi5.Schema.string().description("你的短链域名(必填,如:klei.vip)").default("klei.vip"),
|
|
757
751
|
main_site: import_koishi5.Schema.string().description("主站域名(必填,如:oxygennotincluded.wiki.gg)").default("oxygennotincluded.wiki.gg/zh"),
|
|
758
|
-
mirror_site: import_koishi5.Schema.string().description("镜像站域名(必填,如:wiki.biligame.com)").default("wiki.biligame.com/oni")
|
|
752
|
+
mirror_site: import_koishi5.Schema.string().description("镜像站域名(必填,如:wiki.biligame.com)").default("wiki.biligame.com/oni"),
|
|
753
|
+
logsUrl: import_koishi5.Schema.string().description("日志查看地址").default("htts://klei.vip/onilogs")
|
|
759
754
|
});
|
|
760
755
|
function apply(ctx, config) {
|
|
761
|
-
const logger2 = ctx.logger("oni-sync-bot");
|
|
762
756
|
let ggbot;
|
|
763
757
|
let huijibot;
|
|
764
758
|
ctx.inject(["console"], (ctx2) => {
|
|
@@ -798,56 +792,64 @@ function apply(ctx, config) {
|
|
|
798
792
|
router.redirect(targetUrl);
|
|
799
793
|
});
|
|
800
794
|
ctx.on("ready", async () => {
|
|
801
|
-
|
|
795
|
+
logger.info("初始化中...");
|
|
802
796
|
const sitesConfig = getSitesConfig(config);
|
|
803
797
|
ggbot = await login(sitesConfig.gg);
|
|
804
798
|
huijibot = await login(sitesConfig.huiji);
|
|
805
799
|
if (ggbot.login && huijibot.login) {
|
|
806
|
-
|
|
800
|
+
logger.info("登录成功,插件已准备就绪");
|
|
807
801
|
} else {
|
|
808
|
-
|
|
802
|
+
logger.error("登录失败,请检查配置");
|
|
809
803
|
}
|
|
810
804
|
ctx.cron("15 * * * *", async () => {
|
|
811
805
|
await incrementalUpdate(ggbot, huijibot, config);
|
|
812
806
|
});
|
|
813
807
|
ctx.cron("30 8 * * 4", async () => {
|
|
814
808
|
await syncPages(ggbot, huijibot).then(() => {
|
|
815
|
-
|
|
809
|
+
logger.info("自动任务:尝试同步所有页面,从 WIKIGG 到 灰机wiki");
|
|
816
810
|
}).catch((err) => {
|
|
817
|
-
|
|
811
|
+
logger.error(`同步所有页面失败,错误信息:${err}`);
|
|
818
812
|
});
|
|
819
813
|
});
|
|
820
814
|
ctx.cron("30 8 * * 3", async () => {
|
|
821
815
|
await syncAllImages(ggbot, huijibot, config).then(() => {
|
|
822
|
-
|
|
816
|
+
logger.info("自动任务:尝试同步所有图片,从 WIKIGG 到 灰机wiki");
|
|
823
817
|
}).catch((err) => {
|
|
824
|
-
|
|
818
|
+
logger.error(`同步所有图片失败,错误信息:${err}`);
|
|
825
819
|
});
|
|
826
820
|
});
|
|
827
821
|
});
|
|
828
822
|
ctx.command("sync <pageTitle:string>", "同步指定页面", { authority: 2 }).action(async ({ session }, pageTitle) => {
|
|
829
823
|
await syncSinglePage(ggbot, huijibot, pageTitle, "sync-bot").then(() => {
|
|
830
824
|
session.send(
|
|
831
|
-
`✅ 已尝试同步页面:${pageTitle}
|
|
825
|
+
`✅ 已尝试同步页面:${pageTitle},请前往控制台查看:${config.logsUrl}`
|
|
832
826
|
);
|
|
833
827
|
}).catch((err) => {
|
|
834
828
|
session.send(`❌ 同步页面失败:${pageTitle},错误信息:${err}`);
|
|
835
829
|
});
|
|
836
830
|
});
|
|
837
|
-
ctx.command("sync.incrementalUpdate", "
|
|
838
|
-
|
|
831
|
+
ctx.command("sync.incrementalUpdate", "获取3h内的编辑并尝试更新", {
|
|
832
|
+
authority: 2
|
|
833
|
+
}).alias("增量更新").action(async ({ session }) => {
|
|
834
|
+
session.send(
|
|
835
|
+
`🚀 获取3h内的编辑并尝试更新,任务耗时可能较长,请前往控制台查看日志:${config.logsUrl}`
|
|
836
|
+
);
|
|
839
837
|
await incrementalUpdate(ggbot, huijibot, config).then(() => {
|
|
840
838
|
session.send(
|
|
841
|
-
`✅
|
|
839
|
+
`✅ 已尝试获取三小时前的编辑并同步,请前往控制台查看:${config.logsUrl}`
|
|
842
840
|
);
|
|
843
841
|
}).catch((err) => {
|
|
844
842
|
session.send(`❌ 同步所有页面失败,错误信息:${err}`);
|
|
845
843
|
});
|
|
846
844
|
});
|
|
847
845
|
ctx.command("sync.allpages", "同步所有页面", { authority: 2 }).action(async ({ session }) => {
|
|
848
|
-
session.send(
|
|
846
|
+
session.send(
|
|
847
|
+
`🚀 开始同步所有页面,任务耗时较长,请前往控制台查看日志:${config.logsUrl}`
|
|
848
|
+
);
|
|
849
849
|
await syncPages(ggbot, huijibot).then(() => {
|
|
850
|
-
session.send(
|
|
850
|
+
session.send(
|
|
851
|
+
`✅ 已尝试同步所有页面,请前往控制台查看:${config.logsUrl}`
|
|
852
|
+
);
|
|
851
853
|
}).catch((err) => {
|
|
852
854
|
session.send(`❌ 同步所有页面失败,错误信息:${err}`);
|
|
853
855
|
});
|
|
@@ -855,23 +857,31 @@ function apply(ctx, config) {
|
|
|
855
857
|
ctx.command("sync.module <moduleTitle:string>", "同步指定模块", {
|
|
856
858
|
authority: 2
|
|
857
859
|
}).action(async ({ session }, moduleTitle) => {
|
|
860
|
+
await session.send(`✅ 同步中,请前往控制台查看:${config.logsUrl}`);
|
|
858
861
|
await syncSingleModule(ggbot, huijibot, moduleTitle, "sync-bot").then(() => {
|
|
859
862
|
session.send(
|
|
860
|
-
`✅ 已尝试同步模块:${moduleTitle}
|
|
863
|
+
`✅ 已尝试同步模块:${moduleTitle},请前往控制台查看:${config.logsUrl}`
|
|
861
864
|
);
|
|
862
865
|
}).catch((err) => {
|
|
863
866
|
session.send(`❌ 同步模块失败:${moduleTitle},错误信息:${err}`);
|
|
864
867
|
});
|
|
865
868
|
});
|
|
866
869
|
ctx.command("sync.allmodules", "同步所有模块", { authority: 2 }).action(async ({ session }) => {
|
|
867
|
-
session.send(
|
|
870
|
+
await session.send(
|
|
871
|
+
`🚀 开始同步所有模块,任务耗时较长,请前往控制台查看:${config.logsUrl}`
|
|
872
|
+
);
|
|
868
873
|
await syncModules(ggbot, huijibot).then(() => {
|
|
869
|
-
session.send(
|
|
874
|
+
session.send(
|
|
875
|
+
`✅ 已尝试同步所有模块,请前往控制台查看:${config.logsUrl}`
|
|
876
|
+
);
|
|
870
877
|
}).catch((err) => {
|
|
871
878
|
session.send(`❌ 同步所有模块失败,错误信息:${err}`);
|
|
872
879
|
});
|
|
873
880
|
});
|
|
874
881
|
ctx.command("sync.img <imgTitle:string>", "同步指定图片", { authority: 2 }).action(async ({ session }, imgTitle) => {
|
|
882
|
+
await session.send(
|
|
883
|
+
`🚀 开始同步,任务可能耗时较长,请前往控制台查看:${config.logsUrl}`
|
|
884
|
+
);
|
|
875
885
|
await syncSingleImage(
|
|
876
886
|
ggbot,
|
|
877
887
|
huijibot,
|
|
@@ -884,9 +894,13 @@ function apply(ctx, config) {
|
|
|
884
894
|
});
|
|
885
895
|
});
|
|
886
896
|
ctx.command("sync.allimgs", "同步所有图片", { authority: 2 }).action(async ({ session }) => {
|
|
887
|
-
session.send(
|
|
897
|
+
session.send(
|
|
898
|
+
`🚀 开始同步所有图片,任务耗时较长,请前往控制台查看:${config.logsUrl}`
|
|
899
|
+
);
|
|
888
900
|
await syncAllImages(ggbot, huijibot, config).then(() => {
|
|
889
|
-
session.send(
|
|
901
|
+
session.send(
|
|
902
|
+
`✅ 已尝试同步所有图片,请前往控制台查看:${config.logsUrl}`
|
|
903
|
+
);
|
|
890
904
|
}).catch((err) => {
|
|
891
905
|
session.send(`❌ 同步所有图片失败,错误信息:${err}`);
|
|
892
906
|
});
|
|
@@ -993,7 +1007,7 @@ function apply(ctx, config) {
|
|
|
993
1007
|
format: "json",
|
|
994
1008
|
aplimit: "max"
|
|
995
1009
|
});
|
|
996
|
-
|
|
1010
|
+
logger.info("主站页面查询成功");
|
|
997
1011
|
const pages = res.query.allpages || [];
|
|
998
1012
|
const pageData = pages.map((page) => {
|
|
999
1013
|
const { pinyin_full, pinyin_first } = generatePinyinInfo(page.title);
|
|
@@ -1008,9 +1022,9 @@ function apply(ctx, config) {
|
|
|
1008
1022
|
await ctx.database.upsert("wikipages", pageData);
|
|
1009
1023
|
}
|
|
1010
1024
|
session.send(`✅ 检索到 ${pages.length} 个页面,已更新至数据库`);
|
|
1011
|
-
|
|
1025
|
+
logger.info(`检索到 ${pages.length} 个页面,已更新至数据库`);
|
|
1012
1026
|
} catch (err) {
|
|
1013
|
-
|
|
1027
|
+
logger.error("主站缓存更新失败", err);
|
|
1014
1028
|
session.send("❌ 主站缓存更新失败,请联系管理员查看日志");
|
|
1015
1029
|
}
|
|
1016
1030
|
});
|
|
@@ -1018,9 +1032,9 @@ function apply(ctx, config) {
|
|
|
1018
1032
|
try {
|
|
1019
1033
|
const count = await ctx.database.remove("wikipages", {});
|
|
1020
1034
|
session.send(`✅ 已删除 ${count.removed} 条本地缓存`);
|
|
1021
|
-
|
|
1035
|
+
logger.info(`已删除 ${count.removed} 条本地缓存`);
|
|
1022
1036
|
} catch (err) {
|
|
1023
|
-
|
|
1037
|
+
logger.error("删除缓存失败", err);
|
|
1024
1038
|
session.send("❌ 删除缓存失败,请联系管理员查看日志");
|
|
1025
1039
|
}
|
|
1026
1040
|
});
|
|
@@ -1028,9 +1042,9 @@ function apply(ctx, config) {
|
|
|
1028
1042
|
try {
|
|
1029
1043
|
const pages = await ctx.database.get("wikipages", {});
|
|
1030
1044
|
session.send(`📊 数据库中缓存了 ${pages.length} 条页面`);
|
|
1031
|
-
|
|
1045
|
+
logger.info(`数据库中缓存了 ${pages.length} 条页面`);
|
|
1032
1046
|
} catch (err) {
|
|
1033
|
-
|
|
1047
|
+
logger.error("查询缓存状态失败", err);
|
|
1034
1048
|
session.send("❌ 查询缓存状态失败,请联系管理员查看日志");
|
|
1035
1049
|
}
|
|
1036
1050
|
});
|
|
@@ -1046,11 +1060,11 @@ function apply(ctx, config) {
|
|
|
1046
1060
|
`#REDIRECT [[${targetPageName}]]`,
|
|
1047
1061
|
"来自qq机器人的添加重定向页面请求"
|
|
1048
1062
|
);
|
|
1049
|
-
|
|
1063
|
+
logger.info(`已为 ${pageName} 添加重定向至 ${targetPageName}`);
|
|
1050
1064
|
session.send(`✅ 已尝试添加重定向 ${pageName} -> ${targetPageName}`);
|
|
1051
1065
|
await session.execute(`update`);
|
|
1052
1066
|
} catch (err) {
|
|
1053
|
-
|
|
1067
|
+
logger.error(`添加重定向 ${pageName} -> ${targetPageName} 失败`, err);
|
|
1054
1068
|
session.send(`❌ 添加重定向失败,请联系管理员查看日志`);
|
|
1055
1069
|
}
|
|
1056
1070
|
});
|
package/package.json
CHANGED
package/lib/config/index.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Config } from "../index";
|
|
2
|
-
export interface ISiteConfig {
|
|
3
|
-
name: string;
|
|
4
|
-
api: string;
|
|
5
|
-
username: string;
|
|
6
|
-
password: string;
|
|
7
|
-
uakey?: string;
|
|
8
|
-
userAgent: string;
|
|
9
|
-
}
|
|
10
|
-
interface ISitesConfig {
|
|
11
|
-
gg: ISiteConfig;
|
|
12
|
-
huiji: ISiteConfig;
|
|
13
|
-
}
|
|
14
|
-
export declare function getSitesConfig(config: Config): ISitesConfig;
|
|
15
|
-
export {};
|
package/lib/sync/imgSync.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Mwn } from "mwn";
|
|
2
|
-
import { Config } from "../index";
|
|
3
|
-
export declare const CONFIG: {
|
|
4
|
-
IGNORED_IMAGES: any[];
|
|
5
|
-
SYNC_INTERVAL_SUCCESS: number;
|
|
6
|
-
SYNC_INTERVAL_FAILED: number;
|
|
7
|
-
UPLOAD_COMMENT: string;
|
|
8
|
-
UPLOAD_TEXT: string;
|
|
9
|
-
};
|
|
10
|
-
interface ImageInfo {
|
|
11
|
-
url: string;
|
|
12
|
-
sha1: string;
|
|
13
|
-
size?: number;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* 获取图片的原始URL和SHA1
|
|
17
|
-
*/
|
|
18
|
-
declare function getImageInfo(site: Mwn, fileName: string): Promise<ImageInfo | null>;
|
|
19
|
-
/**
|
|
20
|
-
* 同步单个图片
|
|
21
|
-
*/
|
|
22
|
-
declare function syncSingleImage(sourceBot: Mwn, targetBot: Mwn, fileName: string, config: Config): Promise<{
|
|
23
|
-
success: boolean;
|
|
24
|
-
reason?: string;
|
|
25
|
-
}>;
|
|
26
|
-
/**
|
|
27
|
-
* 批量同步所有图片(带失败重试)
|
|
28
|
-
*/
|
|
29
|
-
declare function syncAllImages(sourceBot: Mwn, targetBot: Mwn, config: Config): Promise<void>;
|
|
30
|
-
export { syncSingleImage, syncAllImages, getImageInfo };
|
package/lib/sync/moduleSync.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Mwn } from "mwn";
|
|
2
|
-
/**
|
|
3
|
-
* 同步单个模块
|
|
4
|
-
* @param oldSite 原站点
|
|
5
|
-
* @param newSite 新站点
|
|
6
|
-
* @param moduleTitle 模块标题
|
|
7
|
-
* @param user 触发同步的用户
|
|
8
|
-
* @returns
|
|
9
|
-
*/
|
|
10
|
-
declare function syncSingleModule(oldSite: Mwn, newSite: Mwn, moduleTitle: string, user?: string): Promise<{
|
|
11
|
-
success: boolean;
|
|
12
|
-
reason?: string;
|
|
13
|
-
}>;
|
|
14
|
-
/**
|
|
15
|
-
* 批量同步所有模块
|
|
16
|
-
* @param oldSite 原站点
|
|
17
|
-
* @param newSite 新站点
|
|
18
|
-
* @returns
|
|
19
|
-
*/
|
|
20
|
-
declare function syncModules(oldSite: Mwn, newSite: Mwn): Promise<void>;
|
|
21
|
-
export { syncSingleModule, syncModules };
|
package/lib/sync/pageSync.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Mwn } from "mwn";
|
|
2
|
-
import { Config } from "../index";
|
|
3
|
-
/**
|
|
4
|
-
* 单页面同步
|
|
5
|
-
* @param oldSite 源站点机器人实例
|
|
6
|
-
* @param newSite 目标站点机器人实例
|
|
7
|
-
* @param pageTitle 同步的标题
|
|
8
|
-
* @param user 触发更改的用户
|
|
9
|
-
* @returns success: boolean;reason: string;
|
|
10
|
-
}
|
|
11
|
-
*/
|
|
12
|
-
declare function syncSinglePage(oldSite: Mwn, newSite: Mwn, pageTitle: string, user: string): Promise<{
|
|
13
|
-
success: boolean;
|
|
14
|
-
reason: string;
|
|
15
|
-
}>;
|
|
16
|
-
/**
|
|
17
|
-
* 同步所有页面
|
|
18
|
-
* @param oldSite 源站点机器人实例
|
|
19
|
-
* @param newSite 目标站点机器人实例
|
|
20
|
-
* @returns null
|
|
21
|
-
*/
|
|
22
|
-
declare function syncPages(oldSite: Mwn, newSite: Mwn): Promise<void>;
|
|
23
|
-
/**
|
|
24
|
-
* 增量更新
|
|
25
|
-
* @param oldSite 源站点机器人实例
|
|
26
|
-
* @param newSite 目标站点机器人实例
|
|
27
|
-
* @param config KOISHI用户配置的项
|
|
28
|
-
*/
|
|
29
|
-
declare function incrementalUpdate(oldSite: Mwn, newSite: Mwn, config: Config): Promise<void>;
|
|
30
|
-
export { syncSinglePage, syncPages, incrementalUpdate };
|
package/lib/utils/login.d.ts
DELETED
package/lib/utils/tools.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Logger } from "koishi";
|
|
2
|
-
import { Mwn } from "mwn";
|
|
3
|
-
/**
|
|
4
|
-
* 获取并处理页面内容
|
|
5
|
-
* @param site 机器人实例
|
|
6
|
-
* @param pageTitle 页面标题
|
|
7
|
-
* @returns 处理后的页面内容(移除跨站链接 + 全局替换 Dev: 为 Module:Dev/)
|
|
8
|
-
*/
|
|
9
|
-
declare function getAndProcessPageContent(site: Mwn, pageTitle: string): Promise<string>;
|
|
10
|
-
/**
|
|
11
|
-
* 处理文本,生成标准化的全拼和首字母
|
|
12
|
-
* @param text 中文文本
|
|
13
|
-
* @returns {pinyin_full: string, pinyin_first: string} 处理后的拼音信息
|
|
14
|
-
*/
|
|
15
|
-
declare function generatePinyinInfo(text: string): {
|
|
16
|
-
pinyin_full: string;
|
|
17
|
-
pinyin_first: string;
|
|
18
|
-
};
|
|
19
|
-
declare const logger: Logger;
|
|
20
|
-
export { getAndProcessPageContent, generatePinyinInfo, logger };
|