From 51ab58cd91c09275054968d6e9588aa0477ed58f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Wed, 29 May 2024 00:07:05 +0800 Subject: [PATCH] fix: webui --- src/webui/ui/NapCat.ts | 10 +- static/assets/qrcode.min.js | 7 - static/assets/renderer copy.js | 476 +++++++++++++++++++++++++++++++++ static/assets/renderer.js | 8 +- 4 files changed, 485 insertions(+), 16 deletions(-) delete mode 100644 static/assets/qrcode.min.js create mode 100644 static/assets/renderer copy.js diff --git a/src/webui/ui/NapCat.ts b/src/webui/ui/NapCat.ts index d458179b..08bd39f2 100644 --- a/src/webui/ui/NapCat.ts +++ b/src/webui/ui/NapCat.ts @@ -141,18 +141,18 @@ async function onSettingWindowCreated(view: Element) { SettingItem( '启用本地进群时间与发言时间记录', undefined, - SettingSwitch('ob11.GroupLocalTime.Record', ob11Config.reverseWs.enable, { + SettingSwitch('ob11.GroupLocalTime.Record', ob11Config.GroupLocalTime.Record, { 'control-display-id': 'config-ob11-GroupLocalTime-RecordList', }) ), - `
+ `
群列表
- 添加 + 添加
-
+
`, SettingItem( '', @@ -313,7 +313,7 @@ async function onSettingWindowCreated(view: Element) { .querySelector('#config-ob11-GroupLocalTime-RecordList-add') ?.addEventListener('click', () => addReverseHost('GroupLocalTime.RecordList', document, { - placeholder: '如:ws://127.0.0.1:5140/onebot', + placeholder: '此处填写群号 -1为全部', }) ); doc.querySelector('#config-ffmpeg-select')?.addEventListener('click', () => { diff --git a/static/assets/qrcode.min.js b/static/assets/qrcode.min.js deleted file mode 100644 index 974e0628..00000000 --- a/static/assets/qrcode.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Skipped minification because the original files appears to be already minified. - * Original file: /npm/qrcode@1.5.1/build/qrcode.js - * - * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files - */ -var QRCode=function(t){"use strict";var r,e=function(){return"function"==typeof Promise&&Promise.prototype&&Promise.prototype.then},n=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706],o=function(t){if(!t)throw new Error('"version" cannot be null or undefined');if(t<1||t>40)throw new Error('"version" should be in range from 1 to 40');return 4*t+17},a=function(t){return n[t]},i=function(t){for(var r=0;0!==t;)r++,t>>>=1;return r},u=function(t){if("function"!=typeof t)throw new Error('"toSJISFunc" is not a valid function.');r=t},s=function(){return void 0!==r},f=function(t){return r(t)};function h(t,r){return t(r={exports:{}},r.exports),r.exports}var c=h((function(t,r){r.L={bit:1},r.M={bit:0},r.Q={bit:3},r.H={bit:2},r.isValid=function(t){return t&&void 0!==t.bit&&t.bit>=0&&t.bit<4},r.from=function(t,e){if(r.isValid(t))return t;try{return function(t){if("string"!=typeof t)throw new Error("Param is not a string");switch(t.toLowerCase()){case"l":case"low":return r.L;case"m":case"medium":return r.M;case"q":case"quartile":return r.Q;case"h":case"high":return r.H;default:throw new Error("Unknown EC Level: "+t)}}(t)}catch(t){return e}}}));function g(){this.buffer=[],this.length=0}c.L,c.M,c.Q,c.H,c.isValid,g.prototype={get:function(t){var r=Math.floor(t/8);return 1==(this.buffer[r]>>>7-t%8&1)},put:function(t,r){for(var e=0;e>>r-e-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){var r=Math.floor(this.length/8);this.buffer.length<=r&&this.buffer.push(0),t&&(this.buffer[r]|=128>>>this.length%8),this.length++}};var d=g;function l(t){if(!t||t<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=t,this.data=new Uint8Array(t*t),this.reservedBit=new Uint8Array(t*t)}l.prototype.set=function(t,r,e,n){var o=t*this.size+r;this.data[o]=e,n&&(this.reservedBit[o]=!0)},l.prototype.get=function(t,r){return this.data[t*this.size+r]},l.prototype.xor=function(t,r,e){this.data[t*this.size+r]^=e},l.prototype.isReserved=function(t,r){return this.reservedBit[t*this.size+r]};var v=l,p=h((function(t,r){var e=o;r.getRowColCoords=function(t){if(1===t)return[];for(var r=Math.floor(t/7)+2,n=e(t),o=145===n?26:2*Math.ceil((n-13)/(2*r-2)),a=[n-7],i=1;i=0&&t<=7},r.from=function(t){return r.isValid(t)?parseInt(t,10):void 0},r.getPenaltyN1=function(t){for(var r=t.size,n=0,o=0,a=0,i=null,u=null,s=0;s=5&&(n+=e+(o-5)),i=h,o=1),(h=t.get(f,s))===u?a++:(a>=5&&(n+=e+(a-5)),u=h,a=1)}o>=5&&(n+=e+(o-5)),a>=5&&(n+=e+(a-5))}return n},r.getPenaltyN2=function(t){for(var r=t.size,e=0,o=0;o=10&&(1488===n||93===n)&&e++,a=a<<1&2047|t.get(u,i),u>=10&&(1488===a||93===a)&&e++}return e*o},r.getPenaltyN4=function(t){for(var r=0,e=t.data.length,n=0;n=0;){for(var n=e[0],o=0;o0){var o=new Uint8Array(this.degree);return o.set(e,n),o}return e};var L=T,b=function(t){return!isNaN(t)&&t>=1&&t<=40},U="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+",x="(?:(?![A-Z0-9 $%*+\\-./:]|"+(U=U.replace(/u/g,"\\u"))+")(?:.|[\r\n]))+",k=new RegExp(U,"g"),F=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),S=new RegExp(x,"g"),D=new RegExp("[0-9]+","g"),Y=new RegExp("[A-Z $%*+\\-./:]+","g"),_=new RegExp("^"+U+"$"),z=new RegExp("^[0-9]+$"),H=new RegExp("^[A-Z0-9 $%*+\\-./:]+$"),J={KANJI:k,BYTE_KANJI:F,BYTE:S,NUMERIC:D,ALPHANUMERIC:Y,testKanji:function(t){return _.test(t)},testNumeric:function(t){return z.test(t)},testAlphanumeric:function(t){return H.test(t)}},K=h((function(t,r){r.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},r.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},r.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},r.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},r.MIXED={bit:-1},r.getCharCountIndicator=function(t,r){if(!t.ccBits)throw new Error("Invalid mode: "+t);if(!b(r))throw new Error("Invalid version: "+r);return r>=1&&r<10?t.ccBits[0]:r<27?t.ccBits[1]:t.ccBits[2]},r.getBestModeForData=function(t){return J.testNumeric(t)?r.NUMERIC:J.testAlphanumeric(t)?r.ALPHANUMERIC:J.testKanji(t)?r.KANJI:r.BYTE},r.toString=function(t){if(t&&t.id)return t.id;throw new Error("Invalid mode")},r.isValid=function(t){return t&&t.bit&&t.ccBits},r.from=function(t,e){if(r.isValid(t))return t;try{return function(t){if("string"!=typeof t)throw new Error("Param is not a string");switch(t.toLowerCase()){case"numeric":return r.NUMERIC;case"alphanumeric":return r.ALPHANUMERIC;case"kanji":return r.KANJI;case"byte":return r.BYTE;default:throw new Error("Unknown mode: "+t)}}(t)}catch(t){return e}}}));K.NUMERIC,K.ALPHANUMERIC,K.BYTE,K.KANJI,K.MIXED,K.getCharCountIndicator,K.getBestModeForData,K.isValid;var O=h((function(t,r){var e=i(7973);function n(t,r){return K.getCharCountIndicator(t,r)+4}function o(t,r){var e=0;return t.forEach((function(t){var o=n(t.mode,r);e+=o+t.getBitsLength()})),e}r.from=function(t,r){return b(t)?parseInt(t,10):r},r.getCapacity=function(t,r,e){if(!b(t))throw new Error("Invalid QR Code version");void 0===e&&(e=K.BYTE);var o=8*(a(t)-M(t,r));if(e===K.MIXED)return o;var i=o-n(e,t);switch(e){case K.NUMERIC:return Math.floor(i/10*3);case K.ALPHANUMERIC:return Math.floor(i/11*2);case K.KANJI:return Math.floor(i/13);case K.BYTE:default:return Math.floor(i/8)}},r.getBestVersionForData=function(t,e){var n,a=c.from(e,c.M);if(Array.isArray(t)){if(t.length>1)return function(t,e){for(var n=1;n<=40;n++){if(o(t,n)<=r.getCapacity(n,e,K.MIXED))return n}}(t,a);if(0===t.length)return 1;n=t[0]}else n=t;return function(t,e,n){for(var o=1;o<=40;o++)if(e<=r.getCapacity(o,n,t))return o}(n.mode,n.getLength(),a)},r.getEncodedBits=function(t){if(!b(t)||t<7)throw new Error("Invalid QR Code version");for(var r=t<<12;i(r)-e>=0;)r^=7973<=0;)n^=1335<0&&(e=this.data.substr(r),n=parseInt(e,10),t.put(n,3*o+1))};var j=q,$=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function X(t){this.mode=K.ALPHANUMERIC,this.data=t}X.getBitsLength=function(t){return 11*Math.floor(t/2)+t%2*6},X.prototype.getLength=function(){return this.data.length},X.prototype.getBitsLength=function(){return X.getBitsLength(this.data.length)},X.prototype.write=function(t){var r;for(r=0;r+2<=this.data.length;r+=2){var e=45*$.indexOf(this.data[r]);e+=$.indexOf(this.data[r+1]),t.put(e,11)}this.data.length%2&&t.put($.indexOf(this.data[r]),6)};var Z=X;function W(t){this.mode=K.BYTE,"string"==typeof t&&(t=function(t){for(var r=[],e=t.length,n=0;n=55296&&o<=56319&&e>n+1){var a=t.charCodeAt(n+1);a>=56320&&a<=57343&&(o=1024*(o-55296)+a-56320+65536,n+=1)}o<128?r.push(o):o<2048?(r.push(o>>6|192),r.push(63&o|128)):o<55296||o>=57344&&o<65536?(r.push(o>>12|224),r.push(o>>6&63|128),r.push(63&o|128)):o>=65536&&o<=1114111?(r.push(o>>18|240),r.push(o>>12&63|128),r.push(o>>6&63|128),r.push(63&o|128)):r.push(239,191,189)}return new Uint8Array(r).buffer}(t)),this.data=new Uint8Array(t)}W.getBitsLength=function(t){return 8*t},W.prototype.getLength=function(){return this.data.length},W.prototype.getBitsLength=function(){return W.getBitsLength(this.data.length)},W.prototype.write=function(t){for(var r=0,e=this.data.length;r=33088&&e<=40956)e-=33088;else{if(!(e>=57408&&e<=60351))throw new Error("Invalid SJIS character: "+this.data[r]+"\nMake sure your charset is UTF-8");e-=49472}e=192*(e>>>8&255)+(255&e),t.put(e,13)}};var rt=tt,et=h((function(t){var r={single_source_shortest_paths:function(t,e,n){var o={},a={};a[e]=0;var i,u,s,f,h,c,g,d=r.PriorityQueue.make();for(d.push(e,0);!d.empty();)for(s in u=(i=d.pop()).value,f=i.cost,h=t[u]||{})h.hasOwnProperty(s)&&(c=f+h[s],g=a[s],(void 0===a[s]||g>c)&&(a[s]=c,d.push(s,c),o[s]=u));if(void 0!==n&&void 0===a[n]){var l=["Could not find a path from ",e," to ",n,"."].join("");throw new Error(l)}return o},extract_shortest_path_from_predecessor_list:function(t,r){for(var e=[],n=r;n;)e.push(n),n=t[n];return e.reverse(),e},find_path:function(t,e,n){var o=r.single_source_shortest_paths(t,e,n);return r.extract_shortest_path_from_predecessor_list(o,n)},PriorityQueue:{make:function(t){var e,n=r.PriorityQueue,o={};for(e in t=t||{},n)n.hasOwnProperty(e)&&(o[e]=n[e]);return o.queue=[],o.sorter=t.sorter||n.default_sorter,o},default_sorter:function(t,r){return t.cost-r.cost},push:function(t,r){var e={value:t,cost:r};this.queue.push(e),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return 0===this.queue.length}}};t.exports=r})),nt=h((function(t,r){function e(t){return unescape(encodeURIComponent(t)).length}function n(t,r,e){for(var n,o=[];null!==(n=t.exec(e));)o.push({data:n[0],index:n.index,mode:r,length:n[0].length});return o}function o(t){var r,e,o=n(J.NUMERIC,K.NUMERIC,t),a=n(J.ALPHANUMERIC,K.ALPHANUMERIC,t);return s()?(r=n(J.BYTE,K.BYTE,t),e=n(J.KANJI,K.KANJI,t)):(r=n(J.BYTE_KANJI,K.BYTE,t),e=[]),o.concat(a,r,e).sort((function(t,r){return t.index-r.index})).map((function(t){return{data:t.data,mode:t.mode,length:t.length}}))}function a(t,r){switch(r){case K.NUMERIC:return j.getBitsLength(t);case K.ALPHANUMERIC:return Z.getBitsLength(t);case K.KANJI:return rt.getBitsLength(t);case K.BYTE:return G.getBitsLength(t)}}function i(t,r){var e,n=K.getBestModeForData(t);if((e=K.from(r,n))!==K.BYTE&&e.bit=0?t[t.length-1]:null;return e&&e.mode===r.mode?(t[t.length-1].data+=r.data,t):(t.push(r),t)}),[])}(s))},r.rawSplit=function(t){return r.fromArray(o(t))}}));function ot(t,r,e){var n,o,a=t.size,i=V(r,e);for(n=0;n<15;n++)o=1==(i>>n&1),n<6?t.set(n,8,o,!0):n<8?t.set(n+1,8,o,!0):t.set(a-15+n,8,o,!0),n<8?t.set(8,a-n-1,o,!0):n<9?t.set(8,15-n-1+1,o,!0):t.set(8,15-n-1,o,!0);t.set(a-8,8,1,!0)}function at(t,r,e){var n=new d;e.forEach((function(r){n.put(r.mode.bit,4),n.put(r.getLength(),K.getCharCountIndicator(r.mode,t)),r.write(n)}));var o=8*(a(t)-M(t,r));for(n.getLengthInBits()+4<=o&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(0);for(var i=(o-n.getLengthInBits())/8,u=0;u=0&&u<=6&&(0===s||6===s)||s>=0&&s<=6&&(0===u||6===u)||u>=2&&u<=4&&s>=2&&s<=4?t.set(a+u,i+s,!0,!0):t.set(a+u,i+s,!1,!0))}(c,r),function(t){for(var r=t.size,e=8;e=7&&function(t,r){for(var e,n,o,a=t.size,i=O.getEncodedBits(r),u=0;u<18;u++)e=Math.floor(u/3),n=u%3+a-8-3,o=1==(i>>u&1),t.set(e,n,o,!0),t.set(n,e,o,!0)}(c,r),function(t,r){for(var e=t.size,n=-1,o=e-1,a=7,i=0,u=e-1;u>0;u-=2)for(6===u&&u--;;){for(var s=0;s<2;s++)if(!t.isReserved(o,u-s)){var f=!1;i>>a&1)),t.set(o,u-s,f),-1===--a&&(i++,a=7)}if((o+=n)<0||e<=o){o-=n,n=-n;break}}}(c,f),isNaN(n)&&(n=E.getBestMask(c,ot.bind(null,c,e))),E.applyMask(n,c),ot(c,e,n),{modules:c,version:r,errorCorrectionLevel:e,maskPattern:n,segments:a}}nt.fromArray,nt.fromString,nt.rawSplit;var ut=function(t,r){if(void 0===t||""===t)throw new Error("No input text");var e,n,o=c.M;return void 0!==r&&(o=c.from(r.errorCorrectionLevel,c.M),e=O.from(r.version),n=E.from(r.maskPattern),r.toSJISFunc&&u(r.toSJISFunc)),it(t,e,o,n)},st=h((function(t,r){function e(t){if("number"==typeof t&&(t=t.toString()),"string"!=typeof t)throw new Error("Color should be defined as hex string");var r=t.slice().replace("#","").split("");if(r.length<3||5===r.length||r.length>8)throw new Error("Invalid hex color: "+t);3!==r.length&&4!==r.length||(r=Array.prototype.concat.apply([],r.map((function(t){return[t,t]})))),6===r.length&&r.push("F","F");var e=parseInt(r.join(""),16);return{r:e>>24&255,g:e>>16&255,b:e>>8&255,a:255&e,hex:"#"+r.slice(0,6).join("")}}r.getOptions=function(t){t||(t={}),t.color||(t.color={});var r=void 0===t.margin||null===t.margin||t.margin<0?4:t.margin,n=t.width&&t.width>=21?t.width:void 0,o=t.scale||4;return{width:n,scale:n?4:o,margin:r,color:{dark:e(t.color.dark||"#000000ff"),light:e(t.color.light||"#ffffffff")},type:t.type,rendererOpts:t.rendererOpts||{}}},r.getScale=function(t,r){return r.width&&r.width>=t+2*r.margin?r.width/(t+2*r.margin):r.scale},r.getImageWidth=function(t,e){var n=r.getScale(t,e);return Math.floor((t+2*e.margin)*n)},r.qrToImageData=function(t,e,n){for(var o=e.modules.size,a=e.modules.data,i=r.getScale(o,n),u=Math.floor((o+2*n.margin)*i),s=n.margin*i,f=[n.color.light,n.color.dark],h=0;h=s&&c>=s&&h':"",s="0&&s>0&&t[u-1]||(n+=a?ct("M",s+e,.5+f+e):ct("m",o,0),o=0,a=!1),s+1',f='viewBox="0 0 '+i+" "+i+'"',h=''+u+s+"\n";return"function"==typeof e&&e(null,h),h};function dt(t,r,n,o,a){var i=[].slice.call(arguments,1),u=i.length,s="function"==typeof i[u-1];if(!s&&!e())throw new Error("Callback required as last argument");if(!s){if(u<1)throw new Error("Too few arguments provided");return 1===u?(n=r,r=o=void 0):2!==u||r.getContext||(o=n,n=r,r=void 0),new Promise((function(e,a){try{var i=ut(n,o);e(t(i,r,o))}catch(t){a(t)}}))}if(u<2)throw new Error("Too few arguments provided");2===u?(a=n,n=r,r=o=void 0):3===u&&(r.getContext&&void 0===a?(a=o,o=void 0):(a=o,o=n,n=r,r=void 0));try{var f=ut(n,o);a(null,t(f,r,o))}catch(t){a(t)}}var lt=ut,vt=dt.bind(null,ft.render),pt=dt.bind(null,ft.renderToDataURL),wt=dt.bind(null,(function(t,r,e){return gt(t,e)})),mt={create:lt,toCanvas:vt,toDataURL:pt,toString:wt};return t.create=lt,t.default=mt,t.toCanvas=vt,t.toDataURL=pt,t.toString=wt,Object.defineProperty(t,"__esModule",{value:!0}),t}({}); diff --git a/static/assets/renderer copy.js b/static/assets/renderer copy.js new file mode 100644 index 00000000..0b3438f5 --- /dev/null +++ b/static/assets/renderer copy.js @@ -0,0 +1,476 @@ +const SettingList = (items, title, isCollapsible = false, direction = "column") => { + return ` + + + ${items.join("")} + + + `; +}; + +const SettingItem = (title, subtitle, action, id, visible = true) => { + return ` +
+ ${title} + ${subtitle ? `${subtitle}` : ""} +
+ ${action ? `
${action}
` : ""} +
`; +}; + +const SettingButton = (text, id, type = "secondary") => { + return `${text}`; +}; + +const SettingSwitch = (configKey, isActive = false, extraData) => { + return ` `data-${key}="${extraData[key]}"`) : ""} + > + `; +}; + +const SettingOption = (text, value, isSelected = false) => { + return `${text}`; +}; + +const SelectTemplate = document.createElement("template"); +SelectTemplate.innerHTML = ` +
+
+ + + + +
+ +
`; +window.customElements.define( + "ob-setting-select", + class extends HTMLElement { + _button; + _text; + _context; + constructor() { + super(); + this.attachShadow({ mode: "open" }); + this.shadowRoot?.append(SelectTemplate.content.cloneNode(true)); + this._button = this.shadowRoot.querySelector('div[part="button"]'); + this._text = this.shadowRoot.querySelector('input[part="current-text"]'); + this._context = this.shadowRoot.querySelector('ul[part="option-list"]'); + const buttonClick = () => { + const isHidden = this._context.classList.toggle("hidden"); + window[`${isHidden ? "remove" : "add"}EventListener`]("pointerdown", windowPointerDown); + }; + const windowPointerDown = ({ target }) => { + if (!this.contains(target)) + buttonClick(); + }; + this._button.addEventListener("click", buttonClick); + this._context.addEventListener("click", ({ target }) => { + if (target.tagName !== "SETTING-OPTION") + return; + buttonClick(); + if (target.hasAttribute("is-selected")) + return; + this.querySelectorAll("setting-option[is-selected]").forEach((dom) => dom.toggleAttribute("is-selected")); + target.toggleAttribute("is-selected"); + this._text.value = target.textContent; + this.dispatchEvent( + new CustomEvent("selected", { + bubbles: true, + composed: true, + detail: { + name: target.textContent, + value: target.dataset.value + } + }) + ); + }); + this._text.value = this.querySelector("setting-option[is-selected]")?.textContent; + } + } +); +const SettingSelect = (items, configKey, configValue) => { + return ` + ${items.map((e, i) => { + return SettingOption(e.text, e.value, configKey && configValue ? configValue === e.value : i === 0); + }).join("")} +`; +}; + +class WebUiApiOB11ConfigWrapper { + retCredential = ""; + async Init(Credential) { + this.retCredential = Credential; + } + async GetOB11Config() { + const ConfigResponse = await fetch("/api/OB11Config/GetConfig", { + method: "POST", + headers: { + Authorization: "Bearer " + this.retCredential, + "Content-Type": "application/json" + } + }); + if (ConfigResponse.status == 200) { + const ConfigResponseJson = await ConfigResponse.json(); + if (ConfigResponseJson.code == 0) { + return ConfigResponseJson?.data; + } + } + return {}; + } + async SetOB11Config(config) { + const ConfigResponse = await fetch("/api/OB11Config/SetConfig", { + method: "POST", + headers: { + Authorization: "Bearer " + this.retCredential, + "Content-Type": "application/json" + }, + body: JSON.stringify({ config: JSON.stringify(config) }) + }); + if (ConfigResponse.status == 200) { + const ConfigResponseJson = await ConfigResponse.json(); + if (ConfigResponseJson.code == 0) { + return true; + } + } + return false; + } +} +const OB11ConfigWrapper = new WebUiApiOB11ConfigWrapper(); + +async function onSettingWindowCreated(view) { + const isEmpty = (value) => value === void 0 || value === void 0 || value === ""; + await OB11ConfigWrapper.Init(localStorage.getItem("auth")); + const ob11Config = await OB11ConfigWrapper.GetOB11Config(); + const setOB11Config = (key, value) => { + const configKey = key.split("."); + if (configKey.length === 2) { + ob11Config[configKey[1]] = value; + } else if (configKey.length === 3) { + ob11Config[configKey[1]][configKey[2]] = value; + } + OB11ConfigWrapper.SetOB11Config(ob11Config); + }; + const parser = new DOMParser(); + const doc = parser.parseFromString( + [ + "
", + ` +
+
`, + SettingList([ + SettingItem( + 'Napcat', + void 0, + SettingButton("V1.4.0", "napcat-update-button", "secondary") + ) + ]), + SettingList([ + SettingItem( + "启用 HTTP 服务", + void 0, + SettingSwitch("ob11.http.enable", ob11Config.http.enable, { + "control-display-id": "config-ob11-http-port" + }) + ), + SettingItem( + "HTTP 服务监听端口", + void 0, + `
`, + "config-ob11-http-port", + ob11Config.http.enable + ), + SettingItem( + "启用 HTTP 心跳", + void 0, + SettingSwitch("ob11.http.enableHeart", ob11Config.http.enableHeart, { + "control-display-id": "config-ob11-HTTP.enableHeart" + }) + ), + SettingItem( + "启用 HTTP 事件上报", + void 0, + SettingSwitch("ob11.http.enablePost", ob11Config.http.enablePost, { + "control-display-id": "config-ob11-http-postUrls" + }) + ), + `
+ +
+ HTTP 事件上报密钥 +
+
+ +
+
+ +
+ HTTP 事件上报地址 +
+ 添加 +
+
+
`, + SettingItem( + "启用正向 WebSocket 服务", + void 0, + SettingSwitch("ob11.ws.enable", ob11Config.ws.enable, { + "control-display-id": "config-ob11-ws-port" + }) + ), + SettingItem( + "正向 WebSocket 服务监听端口", + void 0, + `
`, + "config-ob11-ws-port", + ob11Config.ws.enable + ), + SettingItem( + "启用反向 WebSocket 服务", + void 0, + SettingSwitch("ob11.reverseWs.enable", ob11Config.reverseWs.enable, { + "control-display-id": "config-ob11-reverseWs-urls" + }) + ), + `
+ +
+ 反向 WebSocket 监听地址 +
+ 添加 +
+
+
`, + SettingItem( + " WebSocket 服务心跳间隔", + "控制每隔多久发送一个心跳包,单位为毫秒", + `
` + ), + SettingItem( + "Access token", + void 0, + `
` + ), + SettingItem( + "新消息上报格式", + `如客户端无特殊需求推荐保持默认设置,两者的详细差异可参考 OneBot v11 文档`, + SettingSelect( + [ + { text: "消息段", value: "array" }, + { text: "CQ码", value: "string" } + ], + "ob11.messagePostFormat", + ob11Config.messagePostFormat + ) + ), + SettingItem( + "音乐卡片签名地址", + void 0, + `
`, + "ob11.musicSignUrl" + ), + SettingItem( + "启用本地进群时间与发言时间记录", + void 0, + SettingSwitch("ob11.GroupLocalTime.Record", ob11Config.GroupLocalTime.Record, { + "control-display-id": "config-ob11-GroupLocalTime-RecordList" + }) + ), + `
+ +
+ 群列表 +
+ 添加 +
+
+
`, + SettingItem( + "", + void 0, + SettingButton("保存", "config-ob11-save", "primary") + ) + ]), + SettingList([ + SettingItem( + "上报 Bot 自身发送的消息", + "上报 event 为 message_sent", + SettingSwitch("ob11.reportSelfMessage", ob11Config.reportSelfMessage) + ) + ]), + SettingList([ + SettingItem( + "GitHub 仓库", + "https://github.com/NapNeko/NapCatQQ", + SettingButton("点个星星", "open-github") + ), + SettingItem("NapCat 文档", "", SettingButton("看看文档", "open-docs")), + SettingItem( + "Telegram 群", + "https://t.me/+nLZEnpne-pQ1OWFl", + SettingButton("进去逛逛", "open-telegram") + ), + SettingItem( + "QQ 群", + "545402644", + SettingButton("我要进去", "open-qq-group") + ) + ]), + "
" + ].join(""), + "text/html" + ); + doc.querySelector("#open-github")?.addEventListener("click", () => { + window.open("https://napneko.github.io/", "_blank"); + }); + doc.querySelector("#open-telegram")?.addEventListener("click", () => { + window.open("https://t.me/+nLZEnpne-pQ1OWFl"); + }); + doc.querySelector("#open-qq-group")?.addEventListener("click", () => { + window.open("https://qm.qq.com/q/bDnHRG38aI"); + }); + doc.querySelector("#open-docs")?.addEventListener("click", () => { + window.open("https://github.com/NapNeko/NapCatQQ"); + }); + const buildHostListItem = (type, host, index, inputAttrs = {}) => { + const dom = { + container: document.createElement("setting-item"), + input: document.createElement("input"), + inputContainer: document.createElement("div"), + deleteBtn: document.createElement("setting-button") + }; + dom.container.classList.add("setting-host-list-item"); + dom.container.dataset.direction = "row"; + Object.assign(dom.input, inputAttrs); + dom.input.classList.add("q-input__inner"); + dom.input.type = "url"; + dom.input.value = host; + dom.input.addEventListener("input", () => { + ob11Config[type.split("-")[0]][type.split("-")[1]][index] = dom.input.value; + }); + dom.inputContainer.classList.add("q-input"); + dom.inputContainer.appendChild(dom.input); + dom.deleteBtn.innerHTML = "删除"; + dom.deleteBtn.dataset.type = "secondary"; + dom.deleteBtn.addEventListener("click", () => { + ob11Config[type.split("-")[0]][type.split("-")[1]].splice(index, 1); + initReverseHost(type); + }); + dom.container.appendChild(dom.inputContainer); + dom.container.appendChild(dom.deleteBtn); + return dom.container; + }; + const buildHostList = (hosts, type, inputAttr = {}) => { + const result = []; + hosts?.forEach((host, index) => { + result.push(buildHostListItem(type, host, index, inputAttr)); + }); + return result; + }; + const addReverseHost = (type, doc2 = document, inputAttr = {}) => { + type = type.replace(/\./g, "-"); + const hostContainerDom = doc2.body.querySelector( + `#config-ob11-${type}-list` + ); + hostContainerDom?.appendChild( + buildHostListItem( + type, + "", + ob11Config[type.split("-")[0]][type.split("-")[1]].length, + inputAttr + ) + ); + ob11Config[type.split("-")[0]][type.split("-")[1]].push(""); + }; + const initReverseHost = (type, doc2 = document) => { + type = type.replace(/\./g, "-"); + const hostContainerDom = doc2.body?.querySelector( + `#config-ob11-${type}-list` + ); + if (hostContainerDom) { + [...hostContainerDom.childNodes].forEach((dom) => dom.remove()); + buildHostList( + ob11Config[type.split("-")[0]][type.split("-")[1]], + type + ).forEach((dom) => { + hostContainerDom?.appendChild(dom); + }); + } + }; + initReverseHost("http.postUrls", doc); + initReverseHost("reverseWs.urls", doc); + initReverseHost("GroupLocalTime.RecordList", doc); + doc.querySelector("#config-ob11-http-postUrls-add")?.addEventListener( + "click", + () => addReverseHost("http.postUrls", document, { + placeholder: "如:http://127.0.0.1:5140/onebot" + }) + ); + doc.querySelector("#config-ob11-reverseWs-urls-add")?.addEventListener( + "click", + () => addReverseHost("reverseWs.urls", document, { + placeholder: "如:ws://127.0.0.1:5140/onebot" + }) + ); + doc.querySelector("#config-ob11-GroupLocalTime-RecordList-add")?.addEventListener( + "click", + () => addReverseHost("GroupLocalTime.RecordList", document, { + placeholder: "此处填写群号 -1为全部" + }) + ); + doc.querySelector("#config-ffmpeg-select")?.addEventListener("click", () => { + }); + doc.querySelector("#config-open-log-path")?.addEventListener("click", () => { + }); + doc.querySelectorAll("setting-switch[data-config-key]").forEach((dom) => { + dom.addEventListener("click", () => { + const active = dom.getAttribute("is-active") == void 0; + setOB11Config(dom.dataset.configKey, active); + if (active) + dom.setAttribute("is-active", ""); + else + dom.removeAttribute("is-active"); + if (!isEmpty(dom.dataset.controlDisplayId)) { + const displayDom = document.querySelector( + //@ts-expect-error 等待修复 + `#${dom.dataset.controlDisplayId}` + ); + if (active) + displayDom?.removeAttribute("is-hidden"); + else + displayDom?.setAttribute("is-hidden", ""); + } + }); + }); + doc.querySelectorAll( + "setting-item .q-input input.q-input__inner[data-config-key]" + ).forEach((dom) => { + dom.addEventListener("input", () => { + const Type = dom.getAttribute("type"); + const configKey = dom.dataset.configKey; + const configValue = Type === "number" ? parseInt(dom.value) >= 1 ? parseInt(dom.value) : 1 : dom.value; + setOB11Config(configKey, configValue); + }); + }); + doc.querySelectorAll("ob-setting-select[data-config-key]").forEach((dom) => { + dom?.addEventListener("selected", (e) => { + const configKey = dom.dataset.configKey; + const configValue = e.detail.value; + setOB11Config(configKey, configValue); + }); + }); + doc.querySelector("#config-ob11-save")?.addEventListener("click", () => { + OB11ConfigWrapper.SetOB11Config(ob11Config); + alert("保存成功"); + }); + doc.body.childNodes.forEach((node) => { + view.appendChild(node); + }); +} + +export { onSettingWindowCreated }; diff --git a/static/assets/renderer.js b/static/assets/renderer.js index 9267511d..f5c4ebe8 100644 --- a/static/assets/renderer.js +++ b/static/assets/renderer.js @@ -277,18 +277,18 @@ async function onSettingWindowCreated(view) { SettingItem( "启用本地进群时间与发言时间记录", void 0, - SettingSwitch("ob11.GroupLocalTime.Record", ob11Config.reverseWs.enable, { + SettingSwitch("ob11.GroupLocalTime.Record", ob11Config.GroupLocalTime.Record, { "control-display-id": "config-ob11-GroupLocalTime-RecordList" }) ), - `
+ `
群列表
- 添加 + 添加
-
+
`, SettingItem( "",