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 CHANGED
@@ -1 +1 @@
1
- import{defineComponent as p,resolveComponent as e,openBlock as r,createBlock as u,withCtx as n,createVNode as c,createElementVNode as d}from"vue";const m=p({__name:"page",setup(t){return(s,o)=>{const a=e("k-card-content"),_=e("k-card"),l=e("k-layout");return r(),u(l,null,{default:n(()=>[c(_,null,{default:n(()=>[c(a,null,{default:n(()=>[...o[0]||(o[0]=[d("p",null," 这是想写却不知道咋写的页面 ",-1)])]),_:1})]),_:1})]),_:1})}}}),f=t=>{t.page({name:"同步机器人",path:"/syncbot",component:m})};export{f as default};
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
@@ -21,6 +21,7 @@ export interface Config {
21
21
  domain: string;
22
22
  main_site: string;
23
23
  mirror_site: string;
24
+ logsUrl: string;
24
25
  }
25
26
  export declare const Config: Schema<Config>;
26
27
  export declare function apply(ctx: Context, config: Config): void;
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
- const textWithReplacedDev = textWithoutCrossLink.replace(
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
- logger2.info("初始化中...");
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
- logger2.info("登录成功,插件已准备就绪");
800
+ logger.info("登录成功,插件已准备就绪");
807
801
  } else {
808
- logger2.error("登录失败,请检查配置");
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
- logger2.info("自动任务:尝试同步所有页面,从 WIKIGG 到 灰机wiki");
809
+ logger.info("自动任务:尝试同步所有页面,从 WIKIGG 到 灰机wiki");
816
810
  }).catch((err) => {
817
- logger2.error(`同步所有页面失败,错误信息:${err}`);
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
- logger2.info("自动任务:尝试同步所有图片,从 WIKIGG 到 灰机wiki");
816
+ logger.info("自动任务:尝试同步所有图片,从 WIKIGG 到 灰机wiki");
823
817
  }).catch((err) => {
824
- logger2.error(`同步所有图片失败,错误信息:${err}`);
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},从 WIKIGG 到 灰机wiki`
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", "同步所有页面", { authority: 2 }).alias("增量更新").action(async ({ session }) => {
838
- session.send(`🚀 开始同步所有页面,任务耗时可能较长,请耐心等待...`);
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
- `✅ 已尝试获取三小时前的编辑并同步,从 WIKIGG 到 灰机wiki`
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(`✅ 已尝试同步所有页面,从 WIKIGG 到 灰机wiki`);
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},从 WIKIGG 到 灰机wiki`
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(`✅ 已尝试同步所有模块,从 WIKIGG 到 灰机wiki`);
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(`✅ 已尝试同步所有图片,从 WIKIGG 到 灰机wiki`);
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
- logger2.info("主站页面查询成功");
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
- logger2.info(`检索到 ${pages.length} 个页面,已更新至数据库`);
1025
+ logger.info(`检索到 ${pages.length} 个页面,已更新至数据库`);
1012
1026
  } catch (err) {
1013
- logger2.error("主站缓存更新失败", err);
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
- logger2.info(`已删除 ${count.removed} 条本地缓存`);
1035
+ logger.info(`已删除 ${count.removed} 条本地缓存`);
1022
1036
  } catch (err) {
1023
- logger2.error("删除缓存失败", err);
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
- logger2.info(`数据库中缓存了 ${pages.length} 条页面`);
1045
+ logger.info(`数据库中缓存了 ${pages.length} 条页面`);
1032
1046
  } catch (err) {
1033
- logger2.error("查询缓存状态失败", err);
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
- logger2.info(`已为 ${pageName} 添加重定向至 ${targetPageName}`);
1063
+ logger.info(`已为 ${pageName} 添加重定向至 ${targetPageName}`);
1050
1064
  session.send(`✅ 已尝试添加重定向 ${pageName} -> ${targetPageName}`);
1051
1065
  await session.execute(`update`);
1052
1066
  } catch (err) {
1053
- logger2.error(`添加重定向 ${pageName} -> ${targetPageName} 失败`, err);
1067
+ logger.error(`添加重定向 ${pageName} -> ${targetPageName} 失败`, err);
1054
1068
  session.send(`❌ 添加重定向失败,请联系管理员查看日志`);
1055
1069
  }
1056
1070
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-oni-sync-bot",
3
3
  "description": "缺氧Wiki站镜像点同步-测试",
4
- "version": "0.0.3",
4
+ "version": "0.0.4",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
@@ -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 {};
@@ -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 };
@@ -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 };
@@ -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 };
@@ -1,8 +0,0 @@
1
- import { Mwn } from "mwn";
2
- import { ISiteConfig } from "../config";
3
- /**
4
- * 登录机器人
5
- * @param siteConfig 站点配置
6
- * @returns 机器人实例
7
- */
8
- export declare function login(siteConfig: ISiteConfig): Promise<Mwn>;
@@ -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 };