@koishijs/core
Advanced tools
Comparing version 4.7.6 to 4.8.0
@@ -1,7 +0,7 @@ | ||
var je=Object.defineProperty;var f=(m,e)=>je(m,"name",{value:e,configurable:!0});var G=(m,e)=>()=>(e||m((e={exports:{}}).exports,e),e.exports);var ye=G((yt,Be)=>{Be.exports={general:{name:"中文",paren:"({0})",quote:"“{0}”",comma:",",and:"和",or:"或",day:"天",hour:"小时",minute:"分钟",second:"秒"},internal:{"low-authority":"权限不足。","insufficient-arguments":"缺少参数,输入帮助以查看用法。","redunant-arguments":"存在多余参数,输入帮助以查看用法。","invalid-argument":"参数 {0} 输入无效,{1}","unknown-option":"存在未知选项 {0},输入帮助以查看用法。","invalid-option":"选项 {0} 输入无效,{1}","check-syntax":"输入帮助以查看用法。","invalid-number":"请提供一个数字。","invalid-integer":"请提供一个整数。","invalid-posint":"请提供一个正整数。","invalid-natural":"请提供一个非负整数。","invalid-date":"请输入合法的时间。","invalid-user":"请指定正确的用户。","invalid-channel":"请指定正确的频道。"}}});var ve=G((vt,Re)=>{Re.exports={general:{name:"English",paren:" ({0}) ",quote:'"{0}"',comma:", ",and:"and",or:"or",day:"day",hour:"hour",minute:"minute",second:"second"},internal:{"low-authority":"Low authority.","insufficient-arguments":"Insufficient arguments, type help to see usage.","redunant-arguments":"Redunant arguments, type help to see usage.","invalid-argument":"Invalid argument {0}, {1}","unknown-option":"Unknown option {0}, type help to see usage.","invalid-option":"Invalid option {0}, {1}","check-syntax":"Type help to see usage.","invalid-number":"Expect a number.","invalid-integer":"Expect an integer.","invalid-posint":"Expect a positive integer.","invalid-natural":"Expect a non-negative integer.","invalid-date":"Expect a valid date.","invalid-user":"Expect a valid user.","invalid-channel":"Expect a valid channel."}}});var Ce=G((Ct,qe)=>{qe.exports={general:{name:"日本語",paren:"({0})",quote:"「{0}」",comma:"、",and:"と",or:"や",day:"日",hour:"時間",minute:"分",second:"秒"},internal:{"low-authority":"実行できる権限が付与されていません","insufficient-arguments":"パラメータが不足しています、「help」を送信して使い方を確認してください。","redunant-arguments":"パラメータ数が多すぎます、「help」を送信して使い方を確認してください。","invalid-argument":"無効なパラメータ「{0}」、{1}","unknown-option":"未知なオプション「{0}」、「help」を送信して使い方を確認してください。","invalid-option":"無効なオプション「{0}」、{1}","check-syntax":"「help」を送信して使い方を検索してください。","invalid-number":"数字を指定してください。","invalid-integer":"整数を指定してください。","invalid-posint":"正の整数を指定してください。","invalid-natural":"自然数を指定してください。","invalid-date":"日付を指定してください。","invalid-user":"ユーザー名を指定してください。","invalid-channel":"チャンネル名を指定してください。"}}});var we=G((wt,Le)=>{Le.exports={general:{name:"francais",paren:" ({0}) ",quote:'"{0}"',comma:", ",and:"et",or:"ou",day:"jour",hour:"heure",minute:"minute",second:"seconde"},internal:{"low-authority":"Droits insuffisants.","insufficient-arguments":`Arguments insuffisants, tapez "help" pour afficher l'aide`,"redunant-arguments":`Arguments redondants, tapez "help" pour afficher l'aide`,"invalid-argument":"Arguments {0} invalides, {1}","unknown-option":`Option {0} inconnue, tapez "help" pour afficher l'aide`,"invalid-option":"Option {0} invalide, {1}","check-syntax":`Tapez "help" pour afficher l'aide`,"invalid-number":"Entrez un nombre.","invalid-integer":"Entrez un entier.","invalid-posint":"Entrez un entier positif.","invalid-natural":"Entrez un entier non négatif.","invalid-date":"Entrez une date valide.","invalid-user":"Entrez un nom d'utilisateur valide.","invalid-channel":"Entrez un nom de canal valide."}}});var ke=G((kt,Ge)=>{Ge.exports={general:{name:"中文",paren:"({0})",quote:"「{0}」",comma:",",and:"和",or:"或",day:"天",hour:"小時",minute:"分鐘",second:"秒"},internal:{"low-authority":"權限不足。","insufficient-arguments":"參數個數不足,輸入「help」檢視用法。","redunant-arguments":"參數個數冗餘,輸入「help」檢視用法。","invalid-argument":"參數 {0} 無效,{1}","unknown-option":"存在未知選項 {0},輸入「help」檢視用法。","invalid-option":"選項 {0} 無效,{1}","check-syntax":"輸入「help」檢視用法。","invalid-number":"請輸入有效數字。","invalid-integer":"請輸入有效整數。","invalid-posint":"請輸入有效正整數。","invalid-natural":"請輸入有效非負整數。","invalid-date":"請輸入有效時間。","invalid-user":"請指定有效用戶。","invalid-channel":"請指定有效頻道。"}}});var Ke=G((Mn,xt)=>{xt.exports={name:"@koishijs/core",description:"Core Features for Koishi",version:"4.7.6",main:"lib/node.js",module:"lib/browser.js",typings:"lib/index.d.ts",files:["lib"],author:"Shigma <shigma10826@gmail.com>",license:"MIT",repository:{type:"git",url:"git+https://github.com/koishijs/koishi.git",directory:"packages/core"},bugs:{url:"https://github.com/koishijs/koishi/issues"},homepage:"https://koishi.js.org",keywords:["bot","chatbot","koishi"],devDependencies:{"@koishijs/plugin-database-memory":"^1.4.0","@koishijs/plugin-mock":"^1.0.6",chai:"^4.3.6","chai-as-promised":"^7.1.1","chai-shape":"^1.0.0"},dependencies:{"@koishijs/utils":"^5.4.5",cordis:"^1.6.0","fastest-levenshtein":"^1.0.12",minato:"^1.2.1"}}});import{defineProperty as ee,Schema as _,Time as be}from"@koishijs/utils";import{App as B}from"cordis";export*from"@koishijs/utils";export*from"cordis";export*from"minato";import{isNullable as Se,Logger as Ne,Random as ze,Time as te}from"@koishijs/utils";import{Context as _e}from"cordis";var Ae=new Ne("i18n"),Te=Symbol("template"),ne=class{constructor(e){this._data={};this._formatters={};this._presets={};this.define("",{"":""}),this.define("zh",ye()),this.define("en",ve()),this.define("ja",Ce()),this.define("fr",we()),this.define("zh-tw",ke()),this.registerBuiltins()}set(e,t,n){if(t.includes("@")||typeof n=="string"){let i=this._data[e],[r,l]=t.slice(0,-1).split("@");l&&(n[Te]=l),!Se(i[r])&&!e.startsWith("$")&&Ae.warn("override",e,r),i[r]=n,this[_e.current]?.on("dispose",()=>{delete i[r]})}else for(let i in n)this.set(e,t+i+".",n[i])}define(e,...t){this._data[e]||={},typeof t[0]=="string"?this.set(e,t[0]+".",t[1]):this.set(e,"",t[0])}formatter(e,t){this._formatters[e]=t}preset(e,t){this._presets[e]=t}render(e,t,n){if(e!==void 0){if(typeof e!="string"){let i=e[Te],r=this._presets[i];if(!r)throw new Error(`Preset "${i}" not found`);return r(e,t,n)}return e.replace(/\{(.+?)\}/g,(i,r)=>{let[l,...c]=r.split("|"),o=l.trim().split("."),d=t;for(let h of o)if(d=d[h],Se(d))return"";for(let h of c){let x=h.trim().match(/(\w+)(?:\((.+)\))?/),y=this._formatters[x[1]];if(!y)throw new Error(`Formatter "${x[1]}" not found`);let M=x[2]?x[2].split(",").map(C=>C.trim()):[];d=y(d,M,n)}return d.toString()})}}text(e,t,n){let i=new Set;for(let r of e)!r||i.add(r);for(let r in this._data)r.startsWith("$")||i.add(r);for(let r of t)for(let l of i)for(let c of["$"+l,l]){let o=this._data[c]?.[r];if(o!==void 0)return this.render(o,n,l)}return Ae.warn("missing",t[0]),t[0]}registerBuiltins(){let e=["day","hour","minute","second"];this.formatter("time",(t,n,i)=>{for(let r=0;r<3;r++){let l=te[e[r]],c=te[e[r+1]];if(t>=l-c/2){t+=c/2;let o=Math.floor(t/l)+" "+this.text([i],["general."+e[r]],{});return t%l>c&&(o+=` ${Math.floor(t%l/c)} `+this.text([i],["general."+e[r+1]],{})),o}}return Math.round(t/te.second)+" "+this.text([i],["general.second"],{})}),this.preset("plural",(t,n,i)=>{let r=n.length in t?n.length:t.length-1;return this.render(t[r],n,i)}),this.preset("random",(t,n,i)=>this.render(ze.pick(t),n,i)),this.preset("list",(t,n,i)=>{let r=Object.entries(n).map(([l,c])=>this.render(t.item,{key:l,value:c},i));return r.unshift(this.render(t.header,n,i)),r.push(this.render(t.footer,n,i)),r.join(` | ||
`).trim()})}};f(ne,"I18n");_e.service("i18n",{constructor:ne});import{Database as Ee}from"minato";import{Context as V}from"cordis";var X;(function(t){let m;(function(i){i[i.ignore=1]="ignore"})(m=t.Flag||(t.Flag={})),t.fields=[]})(X||(X={}));var W;(function(t){let m;(function(r){r[r.ignore=1]="ignore",r[r.silent=4]="silent"})(m=t.Flag||(t.Flag={})),t.fields=[]})(W||(W={}));var J=class extends Ee{constructor(e){super();this.app=e;this[V.current]=e,this.extend("user",{id:"string(63)",name:{type:"string",length:63},flag:"unsigned(20)",authority:"unsigned(4)",locale:"string(63)"},{autoInc:!0}),this.extend("channel",{id:"string(63)",platform:"string(63)",flag:"unsigned(20)",assignee:"string(63)",guildId:"string(63)",locale:"string(63)"},{primary:["id","platform"]})}async getUser(e,t,n){let i=await this.get("user",{[e]:t},n);return Array.isArray(t)?i:(i[0]&&Object.assign(i[0],{[e]:t}),i[0])}setUser(e,t,n){return this.set("user",{[e]:t},n)}createUser(e,t,n){return this.create("user",{[e]:t,...n})}async getChannel(e,t,n){let i=await this.get("channel",{platform:e,id:t},n);return Array.isArray(t)?i:(i[0]&&Object.assign(i[0],{platform:e,id:t}),i[0])}getSelfIds(e,t){if(e)return t||=this.app.bots.filter(i=>i.platform===e).map(i=>i.selfId),{[e]:t};let n={};for(let i of this.app.bots)(n[i.platform]||=[]).push(i.selfId);return n}async getAssignedChannels(e,t=this.getSelfIds()){return this.get("channel",{$or:Object.entries(t).map(([n,i])=>({platform:n,assignee:i}))},e)}setChannel(e,t,n){return this.set("channel",{platform:e,id:t},n)}createChannel(e,t,n){return this.create("channel",{platform:e,id:t,...n})}async broadcast(...e){let t;Array.isArray(e[0])&&(t=e.shift());let[n,i]=e;if(!n)return[];let r=await this.getAssignedChannels(["id","assignee","flag","platform","guildId"]),l={};for(let{id:c,assignee:o,flag:d,platform:h,guildId:x}of r)t&&!t.includes(`${h}:${c}`)||!i&&d&W.Flag.silent||((l[h]||={})[o]||=[]).push([c,x]);return(await Promise.all(Object.entries(l).flatMap(([c,o])=>this.app.bots.map(d=>d.platform!==c?Promise.resolve([]):d.broadcast(o[d.selfId]||[],n))))).flat(1)}};f(J,"DatabaseService");J.prototype.extend=f(function(e,t,n){Ee.prototype.extend.call(this,e,t,{...n,driver:this[V.current].mapping.database}),this.app.emit("model",e)},"extend");V.service("database");V.service("model",{constructor:J,methods:["getSelfIds","broadcast"]});var Pt=f((m,e,t)=>({name:m.name,reusable:!0,Config:e,apply(n,i){t?.(n,i);let r=new m(n.model,i),l=n.mapping.database||"default";n.on("ready",async()=>{await r.start(),n.model.drivers[l]=r;let c=Object.create(n.model);n.database=c}),n.on("dispose",async()=>{n.database=null,delete n.model.drivers[l],await r.stop()})}}),"defineDriver");import{Logger as We,remove as He}from"@koishijs/utils";import{Context as ie}from"cordis";function R(m,e,...t){return m.intersect(n=>t.length?t.includes(n[e]):!!n[e])}f(R,"property");var re=class{constructor(e){this.app=e;this[ie.current]=e,e.filter=()=>!0,e.on("internal/warning",(t,...n)=>{this.logger("app").warn(t,...n)}),e.on("internal/runtime",t=>{!t.uid||(t.context.filter=n=>t.children.some(i=>i.context.filter(n)))})}get caller(){return this[ie.current]}any(){return this.caller.extend({filter:()=>!0})}never(){return this.caller.extend({filter:()=>!1})}union(e){let t=this.caller,n=typeof e=="function"?e:e.filter;return this.caller.extend({filter:i=>t.filter(i)||n(i)})}intersect(e){let t=this.caller,n=typeof e=="function"?e:e.filter;return this.caller.extend({filter:i=>t.filter(i)&&n(i)})}exclude(e){let t=this.caller,n=typeof e=="function"?e:e.filter;return this.caller.extend({filter:i=>t.filter(i)&&!n(i)})}logger(e){return new We(e)}user(...e){return R(this.caller,"userId",...e)}self(...e){return R(this.caller,"selfId",...e)}guild(...e){return R(this.caller,"guildId",...e)}channel(...e){return R(this.caller,"channelId",...e)}platform(...e){return R(this.caller,"platform",...e)}private(...e){return R(this.caller.exclude(R(this.caller,"guildId")),"userId",...e)}async waterfall(...e){let t=typeof e[0]=="object"?e.shift():null,n=e.shift();for(let i of this.app.lifecycle.getHooks(n,t)){let r=await i.apply(t,e);e[0]=r}return e[0]}chain(...e){let t=typeof e[0]=="object"?e.shift():null,n=e.shift();for(let i of this.app.lifecycle.getHooks(n,t)){let r=i.apply(t,e);e[0]=r}return e[0]}before(e,t,n=!1){let i=e.split("/");return i[i.length-1]="before-"+i[i.length-1],this.caller.on(i.join("/"),t,!n)}createTimerDispose(e){let t=f(()=>{if(clearTimeout(e),!!this.caller.state)return He(this.caller.state.disposables,t)},"dispose");return this.caller.state.disposables.push(t),t}setTimeout(e,t,...n){let i=this.createTimerDispose(setTimeout(()=>{i(),e()},t,...n));return i}setInterval(e,t,...n){return this.createTimerDispose(setInterval(e,t,...n))}};f(re,"SelectorService");ie.service("selector",{constructor:re,methods:["any","never","union","intersect","exclude","select","user","self","guild","channel","platform","private","chain","waterfall","before","logger","setTimeout","setInterval"]});import{coerce as pt,defineProperty as mt,escapeRegExp as ht,makeArray as ft}from"@koishijs/utils";import{Context as ge}from"cordis";import{Logger as lt,paramCase as ct,remove as dt,Schema as P}from"@koishijs/utils";import{Context as fe}from"cordis";import{Logger as Pe,makeArray as st,Random as ot,sleep as at}from"@koishijs/utils";import{Context as pe}from"cordis";import{coerce as Ve,Logger as Xe,remove as q,Schema as H}from"@koishijs/utils";import{camelCase as $e,escapeRegExp as Ie,paramCase as Oe,segment as se,Time as Qe}from"@koishijs/utils";var oe=`"'“‘`,ae=`"'”’`,K;(function(v){let m={};function e(s,a,u){m[s]={terminator:a,parse:u}}v.interpolate=e,f(e,"interpolate"),e("$(",")");class t{constructor(){this.bracs=Object.create(m)}interpolate(a,u,p){this.bracs[a]={terminator:u,parse:p}}parseToken(a,u="$"){let p={inters:[]},g=oe.indexOf(a[0]),k=ae[g],A="";k&&(a=a.slice(1),u=`${k}(?=${u})|$`),u+=`|${Object.keys({...this.bracs,...m}).map(Ie).join("|")}`;let b=new RegExp(u);for(;;){let w=b.exec(a);if(A+=a.slice(0,w.index),w[0]in this.bracs){a=a.slice(w.index+w[0].length).trimStart();let{parse:$,terminator:D}=this.bracs[w[0]],E=$?.(a)||this.parse(a,D);a=E.rest,p.inters.push({...E,pos:A.length,initiator:w[0]})}else{let $=w[0]===k,D=a.slice(w.index+ +$);return p.rest=D.trimStart(),p.quoted=$,p.terminator=w[0],$?p.terminator+=D.slice(0,-p.rest.length):k&&(A=oe[g]+A,p.inters.forEach(E=>E.pos+=1)),p.content=A,k==="'"&&v.revert(p),p}}}parse(a,u=""){let p=[],g=a,k="",A=`\\s+|[${Ie(u)}]|$`;for(;g&&!(u&&g.startsWith(u));){let b=this.parseToken(g,A);p.push(b),g=b.rest,k=b.terminator,delete b.rest}return g.startsWith(u)&&(g=g.slice(1)),a=a.slice(0,-(g+k).length),{tokens:p,rest:g,source:a}}stringify(a){let u=a.tokens.reduce((p,g)=>(g.quoted&&(p+=oe[ae.indexOf(g.terminator[0])]||""),p+g.content+g.terminator),"");return a.rest&&!ae.includes(u[u.length-1])||a.initiator?u.slice(0,-1):u}}f(t,"Tokenizer"),v.Tokenizer=t;let n=new t;function i(s,a=""){return n.parse(s,a)}v.parse=i,f(i,"parse");function r(s){return n.stringify(s)}v.stringify=r,f(r,"stringify");function l(s){for(;s.inters.length;){let{pos:a,source:u,initiator:p}=s.inters.pop();s.content=s.content.slice(0,a)+p+u+m[p].terminator+s.content.slice(a)}}v.revert=l,f(l,"revert");function c(s){return typeof s=="string"?d[s]||{}:{}}f(c,"resolveConfig");function o(s){return typeof s=="function"?s:s instanceof RegExp?a=>{if(s.test(a))return a;throw new Error}:Array.isArray(s)?a=>{if(s.includes(a))return a;throw new Error}:d[s]?.transform}f(o,"resolveType");let d={};function h(s,a,u){d[s]={...u,transform:a}}v.createDomain=h,f(h,"createDomain"),h("rawtext",s=>s),h("string",s=>s),h("text",s=>s,{greedy:!0}),h("rawtext",s=>se.unescape(s),{greedy:!0}),h("boolean",()=>!0),h("number",(s,a)=>{let u=+s;if(Number.isFinite(u))return u;throw new Error("internal.invalid-number")}),h("integer",(s,a)=>{let u=+s;if(u*0==0&&Math.floor(u)===u)return u;throw new Error("internal.invalid-integer")}),h("posint",(s,a)=>{let u=+s;if(u*0==0&&Math.floor(u)===u&&u>0)return u;throw new Error("internal.invalid-posint")}),h("natural",(s,a)=>{let u=+s;if(u*0==0&&Math.floor(u)===u&&u>=0)return u;throw new Error("internal.invalid-natural")}),h("date",(s,a)=>{let u=Qe.parseDate(s);if(+u)return u;throw new Error("internal.invalid-date")}),h("user",(s,a)=>{if(s.startsWith("@"))return s=s.slice(1),s.includes(":")?s:`${a.platform}:${s}`;let u=se.from(s);if(u&&u.type==="at")return`${a.platform}:${u.data.id}`;throw new Error("internal.invalid-user")}),h("channel",(s,a)=>{if(s.startsWith("#"))return s=s.slice(1),s.includes(":")?s:`${a.platform}:${s}`;let u=se.from(s);if(u&&u.type==="sharp")return`${a.platform}:${u.data.id}`;throw new Error("internal.invalid-channel")});let x=/<[^>]+>|\[[^\]]+\]/g;function y(s){let a,u=[];for(;a=x.exec(s);){let p=a[0].slice(1,-1),g=!1;p.startsWith("...")&&(p=p.slice(3),g=!0);let[k,A]=p.split(":"),b=A?A.trim():void 0;u.push({name:k,variadic:g,type:b,required:a[0][0]==="<"})}return u.stripped=s.replace(/:[\w-]+[>\]]/g,p=>p.slice(-1)).trimEnd(),u}f(y,"parseDecl");function M(s,a,u,p,g={}){let{name:k,type:A,fallback:b}=g,w=s===""&&!a;if(w&&b!==void 0)return b;let $=o(A);if($)try{return $(s,p.session)}catch(E){if(!p.session)p.error=`internal.invalid-${u}`;else{let I=p.session.text(E.message||"internal.check-syntax");p.error=p.session.text(`internal.invalid-${u}`,[k,I])}return}if(w)return!0;if(a)return s;let D=+s;return D*0==0?D:s}v.parseValue=M,f(M,"parseValue");class C{constructor(a,u,p){this.name=a;this.ctx=p;this._options={};this._namedOptions={};this._symbolicOptions={};if(!a)throw new Error("expect a command name");let g=this._arguments=y(u);this.declaration=g.stripped}_createOption(a,u,p){let g=Oe(a),k=u.replace(/(?<=^|\s)[\w\x80-\uffff].*/,""),A=u.slice(k.length),b=k.replace(/(?<=^|\s)(<[^<]+>|\[[^[]+\]).*/,""),w=k.slice(b.length);b=b.trim()||"--"+g;let $=[],D=[];for(let T of b.trim().split(",")){T=T.trimStart();let z=T.replace(/^-+/,"");!z||!T.startsWith("-")?D.push(T):$.push(z)}!("value"in p)&&!$.includes(g)&&(b+=", --"+g);let E=y(w);E.stripped&&(b+=" "+E.stripped);let I=this._options[a]||={...F.defaultOptionConfig,...E[0],...p,name:a,values:{},valuesSyntax:{},syntax:b},S=`commands.${this.name}.options.${a}`,O=typeof I.fallback;"value"in p?(S+="."+p.value,I.valuesSyntax[p.value]=b,$.forEach(T=>I.values[T]=p.value)):w.trim()?!I.type&&(O==="string"||O==="number")&&(I.type=O):I.type="boolean",A&&this.ctx.i18n.define("",S,A),this._assignOption(I,$,this._namedOptions),this._assignOption(I,D,this._symbolicOptions),this._namedOptions[g]||(this._namedOptions[g]=I)}_assignOption(a,u,p){for(let g of u){if(g in p)throw new Error(`duplicate option name "${g}" for command "${this.name}"`);p[g]=a}}removeOption(a){if(!this._options[a])return!1;let u=this._options[a];delete this._options[a];for(let p in this._namedOptions)this._namedOptions[p]===u&&delete this._namedOptions[p];for(let p in this._symbolicOptions)this._symbolicOptions[p]===u&&delete this._symbolicOptions[p];return!0}parse(a,u,p=[],g={}){typeof a=="string"&&(a=v.parse(a,u));let k=this.name+" "+v.stringify(a);for(;!a.error&&a.tokens.length;){let A=a.tokens[0],{content:b,quoted:w}=A,$=this._arguments[p.length];if(b[0]!=="-"&&c($?.type).greedy){p.push(v.parseValue(v.stringify(a),!0,"argument",a,$));break}a.tokens.shift();let D,E,I;if(!w&&(D=this._symbolicOptions[b]))E=[Oe(D.name)];else{if(b[0]!=="-"||w){p.push(v.parseValue(b,w,"argument",a,$||{type:"string"}));continue}let S=0,O;for(;S<b.length&&b.charCodeAt(S)===45;++S);if(b.slice(S,S+3)==="no-"&&!this._namedOptions[b.slice(S)]){O=b.slice(S+3),g[$e(O)]=!1;continue}let T=S+1;for(;T<b.length&&b.charCodeAt(T)!==61;T++);O=b.slice(S,T),E=S>1?[O]:O,I=b.slice(++T),D=this._namedOptions[E[E.length-1]]}if(w=!1,!I){let{type:S}=D||{};if(c(S).greedy)I=v.stringify(a),w=!0,a.tokens=[];else if(S!=="boolean"&&a.tokens.length&&(S||a.tokens[0]?.content!=="-")){let O=a.tokens.shift();I=O.content,w=O.quoted}}for(let S=0;S<E.length;S++){let O=E[S],T=this._namedOptions[O],z=T?T.name:$e(O);if(T&&O in T.values)g[z]=T.values[O];else{let Ue=S+1<E.length?"":I;g[z]=v.parseValue(Ue,w,"option",a,T)}if(a.error)break}}for(let{name:A,fallback:b}of Object.values(this._options))b!==void 0&&!(A in g)&&(g[A]=b);return delete a.tokens,{options:g,args:p,source:k,rest:a.rest,error:a.error||""}}stringifyArg(a){return a=""+a,a.includes(" ")?`"${a}"`:a}stringify(a,u){let p=this.name;for(let g in u){let k=u[g];k===!0?p+=` --${g}`:k===!1?p+=` --no-${g}`:p+=` --${g} ${this.stringifyArg(k)}`}for(let g of a)p+=" "+this.stringifyArg(g);return p}}f(C,"CommandBase"),v.CommandBase=C})(K||(K={}));var le=new Xe("command"),ce=class extends K.CommandBase{constructor(e,t,n){super(e,t,n);this.children=[];this.parent=null;this._aliases=[];this._examples=[];this._userFields=[["locale"]];this._channelFields=[["locale"]];this._actions=[];this._checkers=[async e=>this.ctx.serial(e.session,"command/before-execute",e)];this.config={...ce.defaultConfig},this._registerAlias(e),n.$commander._commandList.push(this)}static userFields(e){return this._userFields.push(e),this}static channelFields(e){return this._channelFields.push(e),this}get displayName(){return this._aliases[0]}set displayName(e){this._registerAlias(e,!0)}_registerAlias(e,t=!1){if(e=e.toLowerCase(),this._aliases.includes(e)){t&&(q(this._aliases,e),this._aliases.unshift(e));return}else t?this._aliases.unshift(e):this._aliases.push(e);let i=this.ctx.$commander.getCommand(e);if(!i)this.ctx.$commander._commands.set(e,this);else if(i!==this)throw new Error(`duplicate command names: "${e}"`);this._disposables?.push(()=>{q(this._aliases,e),this.ctx.$commander._commands.delete(e)})}[Symbol.for("nodejs.util.inspect.custom")](){return`Command <${this.name}>`}userFields(e){return this._userFields.push(e),this}channelFields(e){return this._channelFields.push(e),this}alias(...e){if(this._disposed)return this;for(let t of e)this._registerAlias(t);return this}shortcut(e,t={}){return this._disposed?this:(t.name=e,t.command=this,this.ctx.$commander._shortcuts.push(t),this._disposables?.push(()=>q(this.ctx.$commander._shortcuts,t)),this)}subcommand(e,...t){e=this.name+(e.charCodeAt(0)===46?"":"/")+e;let n=typeof t[0]=="string"?t.shift():"",i=t[0]||{};return this._disposed&&(i.patch=!0),this.ctx.command(e,n,i)}usage(e){return this._usage=e,this}example(e){return this._examples.push(e),this}option(e,...t){let n="";typeof t[0]=="string"&&(n=t.shift());let i=t[0];return this._createOption(e,n,i||{}),this._disposables?.push(()=>this.removeOption(e)),this}match(e){let{authority:t=1/0}=e.user||{};return this.ctx.filter(e)&&this.config.authority<=t}getConfig(e,t){let n=this.config[e];return typeof n=="function"?n(t):n}check(e,t=!1){return this.before(e,t)}before(e,t=!1){return t?this._checkers.push(e):this._checkers.unshift(e),this._disposables?.push(()=>q(this._checkers,e)),this}action(e,t=!1){return t?this._actions.unshift(e):this._actions.push(e),this._disposables?.push(()=>q(this._actions,e)),this}use(e,...t){return e(this,...t)}async execute(e,t=U.compose){e.command??=this,e.args??=[],e.options??={};let{args:n,options:i,error:r}=e;if(r)return r;le.level>=3&&le.debug(e.source||=this.stringify(n,i));for(let d of this._checkers){let h=await d.call(this,e,...n);if(typeof h=="string")return h}if(!this._actions.length)return"";let l=0,c=this._actions.map(d=>async()=>await d.call(this,e,...n));c.push(t);let o=c.length;e.next=async d=>{if(d!==void 0&&(c.push(h=>U.compose(d,h)),c.length>U.MAX_DEPTH))throw new Error(`middleware stack exceeded ${U.MAX_DEPTH}`);return c[l++]?.(e.next)};try{let d=await e.next();if(typeof d=="string")return d}catch(d){if(l===o)throw d;let h=Ve(d);le.warn(`${e.source||=this.stringify(n,i)} | ||
${h}`),this.ctx.emit(e.session,"command-error",e,d)}return""}dispose(){this._disposed=!0,this.ctx.emit("command-removed",this);for(let e of this.children.slice())e.dispose();this.ctx.$commander._shortcuts=this.ctx.$commander._shortcuts.filter(e=>e.command!==this),this._aliases.forEach(e=>this.ctx.$commander._commands.delete(e)),q(this.ctx.$commander._commandList,this),this.parent&&q(this.parent.children,this)}},F=ce;f(F,"Command"),F.defaultConfig={authority:1,showWarning:!0},F.defaultOptionConfig={authority:0},F._userFields=[],F._channelFields=[];(function(e){e.Config=H.object({authority:H.natural().default(1),hidden:H.boolean().default(!1),checkArgCount:H.boolean().default(!1),checkUnknown:H.boolean().default(!1)})})(F||(F={}));import{defineProperty as Je,valueMap as Ye}from"@koishijs/utils";function de(m){m.before("parse",(t,n)=>{let i=K.parse(t);return n.quote&&i.tokens.push({content:n.quote.content,quoted:!0,inters:[],terminator:""}),i}),m.before("parse",(t,n)=>{let{parsed:i,quote:r}=n;if(!(i.prefix||r))for(let l of m.$commander._shortcuts){let{name:c,fuzzy:o,command:d,prefix:h,options:x={},args:y=[]}=l;if(!(h&&!i.appel||!d.ctx.filter(n)))if(typeof c=="string"){if(!o&&t!==c||!t.startsWith(c))continue;let M=t.slice(c.length);if(o&&!i.appel&&M.match(/^\S/))continue;let C=K.parse(M.trim());return C.session=n,C=d.parse(C,"",[...y],{...x}),C.command=d,C}else{let C=function(v){return typeof v!="string"?v:(v=v.replace(/\$\$/g,"@@__PLACEHOLDER__@@"),M.forEach((s,a)=>{!a||a>9||(v=v.replace(new RegExp(`\\$${a}`,"g"),(s||"").replace(/\$/g,"@@__PLACEHOLDER__@@")))}),v.replace(/@@__PLACEHOLDER__@@/g,"$"))};f(C,"escape");let M=c.exec(t);if(!M)continue;return{command:d,args:y.map(C),options:Ye(x,C)}}}}),m.before("attach",t=>{Je(t,"argv",m.bail("before-parse",t.parsed.content,t)),t.argv.root=!0,t.argv.session=t});function e(t,n){if(!!m.$commander.getCommand("help"))return t.execute({name:"help",args:[n]})}f(e,"executeHelp"),m.before("command/execute",t=>{let{args:n,command:i,options:r,session:l}=t;if(r.help&&i._options.help)return e(l,i.name);if(i._actions.length)return;let c=n.shift()||"",o=m.$commander.getCommand(i.name+"."+c);if(o){let d=l.__redirected_commands||=[`(${i.name}${i._aliases.length!==0?"|"+i._aliases.join("|"):""})`];d.push(c);let h=new RegExp(`^${d.join("[. ]")}( |$)`);return t=K.parse(l.parsed.content.replace(h,"")),t.session=l,t=o.parse(t),l.execute({...t,command:o})}else return e(l,i.name)})}f(de,"runtime");function ue(m){m.on("command-added",e=>{e.userFields(({tokens:t,command:n,options:i={}},r)=>{if(!n)return;let{authority:l}=n.config,c=l>0;for(let{name:o,authority:d}of Object.values(n._options))o in i?d>0&&(c=!0):t&&d>0&&(c=!0);c&&r.add("authority")})}),m.before("command/execute",e=>{let{session:t,options:n,command:i}=e;if(!t.user)return;function r(l,...c){return i.config.showWarning?t.text(l,c):""}if(f(r,"sendHint"),t.user.authority&&i.getConfig("authority",t)>t.user.authority)return r("internal.low-authority");for(let l of Object.values(i._options))if(l.name in n&&l.authority>t.user.authority)return r("internal.low-authority")}),m.before("command/execute",e=>{let{args:t,options:n,command:i,session:r}=e;function l(c,...o){return i.config.showWarning?r.text(c,o):""}if(f(l,"sendHint"),i.config.checkArgCount){if((i._arguments[t.length]||{}).required)return l("internal.insufficient-arguments");let o=i._arguments[i._arguments.length-1]||{};if(t.length>i._arguments.length&&o.type!=="text"&&!o.variadic)return l("internal.redunant-arguments")}if(i.config.checkUnknown){let c=Object.keys(n).filter(o=>!i._options[o]);if(c.length)return l("internal.unknown-option",c.join(", "))}})}f(ue,"validate");var Q=class{constructor(e,t={}){this.ctx=e;this.config=t;this._commandList=[];this._commands=new Map;this._shortcuts=[];this[pe.current]=e,e.plugin(de),e.plugin(ue)}get caller(){return this[pe.current]}resolve(e){if(!e)return;let t=e.split("."),n=1,i=t[0],r;for(;(r=this.getCommand(i))&&n<t.length;)i=r.name+"."+t[n++];return r}getCommand(e){return this._commands.get(e)}command(e,...t){let n=typeof t[0]=="string"?t.shift():"",i=t[0],r=e.split(" ",1)[0].toLowerCase(),l=e.slice(r.length),c=r.split(/(?=[./])/g),o,d,h=[];if(c.forEach((y,M)=>{let C=y.charCodeAt(0),v=C===46?o.name+y:C===47?y.slice(1):y,s=this.getCommand(v);if(s){if(o){if(s===o)throw new Error(`cannot set a command (${s.name}) as its own subcommand`);if(s.parent){if(s.parent!==o)throw new Error(`cannot create subcommand ${r}: ${s.parent.name}/${s.name} already exists`)}else s.parent=o,o.children.push(s)}return o=s}s=new F(v,l,this.caller),h.push(s),d||(d=s),o&&(s.parent=o,s.config.authority=o.config.authority,o.children.push(s)),o=s}),n&&this.caller.i18n.define("",`commands.${o.name}.description`,n),Object.assign(o.config,i),h.forEach(y=>this.caller.emit("command-added",y)),!i?.patch)return d&&this.caller.state.disposables.unshift(()=>d.dispose()),o;d&&d.dispose();let x=Object.create(o);return x._disposables=this.caller.state.disposables,x}};f(Q,"Commander"),Q.key="$commander";pe.service(Q.key,{constructor:Q,methods:["command"]});import{defineProperty as L,isNullable as Ze,Logger as et,makeArray as tt,observe as me,Random as nt,segment as it}from"@koishijs/utils";import{Context as rt}from"cordis";var he=new et("session"),Y=class{constructor(e,t){Object.assign(this,t),this.platform=e.platform,L(this,"app",e.ctx.app),L(this,"bot",e),L(this,"user",null),L(this,"channel",null),L(this,"id",nt.id()),L(this,"_queuedTasks",[]),L(this,"_queuedTimeout",null)}[rt.filter](e){return e.filter(this)}get uid(){return`${this.platform}:${this.userId}`}get gid(){return`${this.platform}:${this.guildId}`}get cid(){return`${this.platform}:${this.channelId}`}get sid(){return`${this.platform}:${this.selfId}`}toJSON(){return Object.fromEntries(Object.entries(this).filter(([e])=>!e.startsWith("_")&&!e.startsWith("$")))}async _preprocess(){let e,t=this.content.trim();return(e=it.from(t,{type:"quote",caret:!0}))&&(t=t.slice(e.capture[0].length).trimStart(),this.quote=await this.bot.getMessage(e.data.channelId||this.channelId,e.data.id).catch(n=>{he.warn(n)})),t}async preprocess(){return this._promise||=this._preprocess()}get username(){let e=this.user&&this.user.name?this.user.name:this.author?this.author.nickname||this.author.username:this.userId;return this.app.chain("appellation",e,this)}async send(e){if(!!e)return this.bot.sendMessage(this.channelId,e,this.guildId).catch(t=>(he.warn(t),[]))}cancelQueued(e=this.app.options.delay.cancel){clearTimeout(this._queuedTimeout),this._queuedTasks=[],this._queuedTimeout=setTimeout(()=>this._next(),e)}_next(){let e=this._queuedTasks.shift();if(!e){this._queuedTimeout=null;return}this.send(e.content).then(e.resolve,e.reject),this._queuedTimeout=setTimeout(()=>this._next(),e.delay)}async sendQueued(e,t){if(!!e){if(Ze(t)){let{message:n,character:i}=this.app.options.delay;t=Math.max(n,i*e.length)}return new Promise((n,i)=>{this._queuedTasks.push({content:e,delay:t,resolve:n,reject:i}),this._queuedTimeout||this._next()})}}resolveValue(e){return typeof e=="function"?Reflect.apply(e,null,[this]):e}async getChannel(e=this.channelId,t=[]){let{app:n,platform:i,guildId:r}=this;if(!t.length)return{platform:i,id:e,guildId:r};let l=await n.database.getChannel(i,e,t);if(l)return l;let c=await this.resolveValue(n.options.autoAssign)?this.selfId:"";if(c)return n.database.createChannel(i,e,{assignee:c,guildId:r});{let o=n.model.tables.channel.create();return Object.assign(o,{platform:i,id:e,guildId:r,$detached:!0}),o}}async _observeChannelLike(e,t=[]){let n=new Set(t),{platform:i}=this,r=`${i}:${e}`,l=this.app.$internal._channelCache.get(this.id,r);if(l){for(let o in l)n.delete(o);if(!n.size)return l}let c=await this.getChannel(e,[...n]);return l=this.app.$internal._channelCache.get(this.id,r),l?l.$merge(c):(l=me(c,o=>this.app.database.setChannel(i,e,o),`channel ${r}`),this.app.$internal._channelCache.set(this.id,r,l)),l}async observeChannel(e=[]){let t=[this._observeChannelLike(this.channelId,e)];this.channelId!==this.guildId&&t.push(this._observeChannelLike(this.guildId,e));let[n,i=n]=await Promise.all(t);return this.guild=i,this.channel=n,n}async getUser(e=this.userId,t=[]){let{app:n,platform:i}=this;if(!t.length)return{[i]:e};let r=await n.database.getUser(i,e,t);if(r)return r;let l=await this.resolveValue(n.options.autoAuthorize);if(l)return n.database.createUser(i,e,{authority:l});{let c=n.model.tables.user.create();return Object.assign(c,{[i]:e,authority:l,$detached:!0}),c}}async observeUser(e=[]){let t=new Set(e),{userId:n,platform:i}=this,r=this.app.$internal._userCache.get(this.id,this.uid);if(r){for(let c in r)t.delete(c);if(!t.size)return this.user=r}if(this.author?.anonymous){let c=this.app.model.tables.user.create();c[i]=n,c.authority=await this.resolveValue(this.app.options.autoAuthorize);let o=me(c,()=>Promise.resolve());return this.user=o}let l=await this.getUser(n,[...t]);return r=this.app.$internal._userCache.get(this.id,this.uid),r?r.$merge(l):(r=me(l,c=>this.app.database.setUser(this.platform,n,c),`user ${this.uid}`),this.app.$internal._userCache.set(this.id,this.uid,r)),this.user=r}async withScope(e,t){let n=this.scope;try{return this.scope=e,await t()}finally{this.scope=n}}text(e,t={}){let n=[this.app.options.locale];n.unshift(this.user?.locale),this.subtype==="group"&&(n.unshift(this.guild?.locale),n.unshift(this.channel?.locale));let i=tt(e).map(r=>r.startsWith(".")?this.scope?this.scope+r:(this.app.logger("i18n").warn(new Error("missing scope")),""):r);return this.app.i18n.text(n,i,t)}collect(e,t,n=new Set){let i=f(r=>{if(r.session=this,r.tokens)for(let{inters:l}of r.tokens)l.forEach(i);!this.resolve(r)||(this.app.emit(r.session,`command/before-attach-${e}`,r,n),Fe(r,F[`_${e}Fields`],n),Fe(r,r.command[`_${e}Fields`],n))},"collect");return i(t),n}inferCommand(e){if(e.command)return e.command;if(e.name)return e.command=this.app.$commander.resolve(e.name);let{parsed:t,subtype:n}=this;if(e.root&&n!=="private"&&t.prefix===null&&!t.appel||!e.tokens.length)return;let i=this.app.$commander.resolve(e.tokens[0].content);if(i)return e.tokens.shift(),e.command=i}resolve(e){if(!!this.inferCommand(e)){if(e.tokens?.every(t=>!t.inters.length)){let{options:t,args:n,error:i}=e.command.parse(e);e.options={...e.options,...t},e.args=[...e.args||[],...n],e.error=i}return e.command}}async execute(e,t){if(typeof e=="string"&&(e=K.parse(e)),e.session=this,e.tokens){for(let r of e.tokens){let{inters:l}=r,c=[];for(let o=0;o<l.length;++o)c.push(await this.execute(l[o],!0));for(let o=l.length-1;o>=0;--o){let{pos:d}=l[o];r.content=r.content.slice(0,d)+c[o]+r.content.slice(d)}r.inters=[]}if(!this.resolve(e))return""}else if(e.command||=this.app.$commander.getCommand(e.name),!e.command)return he.warn(new Error(`cannot find command ${e.name}`)),"";let{command:n}=e;if(!n.ctx.filter(this))return"";this.app.database&&(this.subtype==="group"&&await this.observeChannel(this.collect("channel",e)),await this.observeUser(this.collect("user",e)));let i=!0;return t===!0&&(i=!1,t=void 0),this.withScope(`commands.${n.name}.messages`,async()=>{let r=await n.execute(e,t);return i?(await this.send(r),""):r})}middleware(e){let t=De(this);return this.app.middleware(async(n,i)=>t&&De(n)!==t?i():e(n,i),!0)}prompt(e=this.app.options.delay.prompt){return new Promise(t=>{let n=this.middleware(r=>{clearTimeout(i),n(),t(r.content)}),i=setTimeout(()=>{n(),t("")},e)})}};f(Y,"Session");function De(m){return""+m.userId+m.channelId}f(De,"getSessionId");function Fe(m,e,t){for(let n of e){if(typeof n=="function"){n(m,t);continue}for(let i of n)t.add(i)}return t}f(Fe,"collectFields");var Me=new Pe("bot"),j=class{constructor(e,t){this.adapter=e;this.config=t;this.id=ot.id();this.ctx=e.ctx,this.app=this.ctx.app,this.platform=t.platform||e.platform,this.logger=new Pe(e.platform),this._status="offline",this.extendModel(),e.ctx.on("ready",()=>this.start()),e.ctx.on("dispose",()=>this.stop())}extendModel(){this.platform in this.ctx.model.tables.user.fields||this.ctx.model.extend("user",{[this.platform]:{type:"string",length:63}},{unique:[this.platform]})}get status(){return this._status}set status(e){this._status=e,this.ctx.bots.includes(this)&&this.ctx.emit("bot-status-updated",this)}resolve(){this.status="online",Me.success("logged in to %s as %c (%s)",this.platform,this.username,this.selfId)}reject(e){this.error=e,this.status="offline",Me.error(e)}async start(){if(!this.config.disabled&&!["connect","reconnect","online"].includes(this.status)){this.status="connect";try{await this.ctx.parallel("bot-connect",this),await this.adapter.connect(this)}catch(e){this.reject(e)}}}async stop(){if(!["disconnect","offline"].includes(this.status)){this.status="disconnect";try{await this.ctx.parallel("bot-disconnect",this),await this.adapter.disconnect(this)}catch(e){this.logger.warn(e)}this.status="offline"}}get sid(){return`${this.platform}:${this.selfId}`}createSession(e){return new Y(this,{...e,type:"send",selfId:this.selfId,platform:this.platform,timestamp:Date.now(),author:{userId:this.selfId,username:this.username,avatar:this.avatar,discriminator:this.discriminator,isBot:!0}})}async session(e){let t=this.createSession(e);if(!await this.ctx.serial(t,"before-send",t))return t}async getGuildMemberMap(e){let t=await this.getGuildMemberList(e);return Object.fromEntries(t.map(n=>[n.userId,n.nickname||n.username]))}async broadcast(e,t,n=this.ctx.app.options.delay.broadcast){let i=[];for(let r=0;r<e.length;r++){r&&n&&await at(n);try{let[l,c]=st(e[r]);i.push(...await this.sendMessage(l,t,c))}catch(l){this.ctx.logger("bot").warn(l)}}return i}};f(j,"Bot");(function(e){e.library={}})(j||(j={}));var N=class{constructor(e,t){this.ctx=e;this.config=t;this.bots=[];e.on("ready",()=>this.start()),e.on("dispose",()=>this.stop())}connect(e){}disconnect(e){}dispatch(e){if(!this.ctx.lifecycle.isActive)return;let t=[e.type];e.subtype&&(t.unshift(t[0]+"/"+e.subtype),e.subsubtype&&t.unshift(t[0]+"/"+e.subsubtype));for(let n of t)this.ctx.emit(e,ct(n),e)}};f(N,"Adapter");var ut=new lt("app");(function(l){l.redirect=Symbol("koishi.adapter.redirect"),l.library={},l.configMap={};function n(c,o){return o?`${c}.${o}`:c}l.join=n,f(n,"join");function i(c,o,...d){let h=c+"-adapter";c=c.toLowerCase(),j.library[c]=o;let x;if(typeof d[0]=="function")l.library[c]=d[0],x=d[0].schema;else{let v=function(s){if(s.type==="union"||s.type==="intersect")s.list.forEach(v);else if(s.type==="object")for(let a in s.dict)C.dict[a]=new P(s.dict[a]),C.dict[a].meta={...s.dict[a].meta,required:!1};else throw new Error("cannot flatten bot schema")};f(v,"flatten"),l.library[c]={[l.redirect]:d[1]},x=l.library[c].schema=P.union([]).description("机器人要使用的协议。");let C=P.object({protocol:P.string()});for(let s in d[0])l.library[n(c,s)]=d[0][s],v(d[0][s].schema),x.list.push(P.intersect([P.object({protocol:P.const(s).required()}),d[0][s].schema]).description(s));x.list.push(P.transform(C,s=>{if(s.protocol)throw new Error(`unknown protocol "${s.protocol}"`);return s.protocol=d[1](s),ut.debug("infer type as %s",s.protocol),s}))}let y=P.intersect([o.schema,P.union([P.object({bots:P.array(x).required().hidden()}),P.transform(x,C=>({bots:[C]}))])]);function M(C,v={}){C.emit("adapter",c),l.configMap[c]=v;for(let s of v.bots)C.bots.create(c,s,o)}return f(M,"apply"),{name:h,Config:y,apply:M}}l.define=i,f(i,"define");class r extends Array{constructor(o){super();this.app=o;this.adapters={};this[fe.current]=o}get caller(){return this[fe.current]}get(o){return this.find(d=>d.sid===o)}create(o,d,h){h||=j.library[o];let x=this.resolve(o,d),y=new h(x,d);return x.bots.push(y),this.push(y),this.caller.emit("bot-added",y),this.caller.on("dispose",()=>{this.remove(y.id)}),y}remove(o){let d=this.findIndex(y=>y.id===o);if(d<0)return;let[h]=this.splice(d,1),x=dt(h.adapter.bots,h);return this.caller.emit("bot-removed",h),x}resolve(o,d){let h=n(o,d.protocol);if(this.adapters[h])return this.adapters[h];let x=l.library[h];if(!x)throw new Error(`unsupported protocol "${h}"`);if(x[l.redirect])return d.protocol=x[l.redirect](d),this.resolve(o,d);let y=new x(this.caller,l.configMap[o]);return y.platform=o,this.caller.on("dispose",()=>{delete this.adapters[h]}),this.adapters[h]=y}}f(r,"BotList"),l.BotList=r})(N||(N={}));fe.service("bots",{constructor:N.BotList});function gt(m,e="",t=""){return m.length?new RegExp(`^${e}(${m.map(ht).join("|")})${t}`):/$^/}f(gt,"createLeadingRE");var U;(function(t){t.MAX_DEPTH=64;async function e(n,i){return typeof n=="function"?n(i):n}t.compose=e,f(e,"compose")})(U||(U={}));var xe=class{constructor(e,t){this.ctx=e;this.config=t;this._hooks=[];this._sessions=Object.create(null);this._userCache=new Z;this._channelCache=new Z;this[ge.current]=e,this.prepare(),this.middleware(this._process.bind(this)),e.on("message",this._handleMessage.bind(this)),e.before("attach-user",(n,i)=>{n.collect("user",n.argv,i)}),e.before("attach-channel",(n,i)=>{n.collect("channel",n.argv,i)}),this.middleware((n,i)=>n.resolve(n.argv)?n.execute(n.argv,i):i())}get caller(){return this[ge.current]}middleware(e,t=!1){return this.caller.lifecycle.register("middleware",this._hooks,e,t)}prepare(){this._nameRE=gt(ft(this.config.nickname),"@?","([,,]\\s*|\\s+)")}_resolvePrefixes(e){let t=e.resolveValue(this.config.prefix);return Array.isArray(t)?t:[t||""]}async _process(e,t){let n,i=!1,r=!1,l=null,c=/^\[CQ:(\w+)((,\w+=[^,\]]*)*)\]/,o=await e.preprocess();e.subtype!=="private"&&(n=o.match(c))&&n[1]==="at"&&n[2].includes("id="+e.selfId)?(i=r=!0,o=o.slice(n[0].length).trimStart()):(n=o.match(this._nameRE))&&(r=!0,o=o.slice(n[0].length));for(let d of this._resolvePrefixes(e))!o.startsWith(d)||(l=d,o=o.slice(d.length));if(mt(e,"parsed",{content:o,appel:r,prefix:l}),this.ctx.emit(e,"before-attach",e),this.ctx.database){if(e.subtype==="group"){let x=new Set(["flag","assignee","guildId","locale"]);this.ctx.emit("before-attach-channel",e,x);let y=await e.observeChannel(x);if(y.guildId=e.guildId,await this.ctx.serial(e,"attach-channel",e)||y.flag&W.Flag.ignore||y.assignee!==e.selfId&&!i)return}let d=new Set(["flag","authority","locale"]);this.ctx.emit("before-attach-user",e,d);let h=await e.observeUser(d);if(await this.ctx.serial(e,"attach-user",e)||h.flag&X.Flag.ignore)return}return this.ctx.emit(e,"attach",e),t()}async _handleMessage(e){if(e.selfId===e.userId)return;this._sessions[e.id]=e;let t=this._hooks.filter(([o])=>o.filter(e)).map(([,o])=>o.bind(null,e)),n=0,i="",r="",{prettyErrors:l}=this.ctx.app.options,c=f(async o=>{if(l&&(r=new Error().stack.split(` | ||
`,3)[2],n)){let d=r.match(/\((.+)\)/);i=` | ||
- ${d?d[1]:r.slice(7)}${i}`}try{if(!this._sessions[e.id])throw new Error("isolated next function detected");if(o!==void 0&&(t.push(d=>U.compose(o,d)),t.length>U.MAX_DEPTH))throw new Error(`middleware stack exceeded ${U.MAX_DEPTH}`);return await t[n++]?.(c)}catch(d){let h=pt(d);if(l){let x=h.indexOf(r);x>=0?h=h.slice(0,x):h+=` | ||
`,h+=`Middleware stack:${i}`}this.ctx.logger("session").warn(`${e.content} | ||
${h}`)}},"next");try{let o=await c();o&&await e.send(o)}finally{delete this._sessions[e.id],this.ctx.emit(e,"middleware",e),this._userCache.delete(e.id),this._channelCache.delete(e.id),await e.user?.$update(),await e.channel?.$update(),await e.guild?.$update()}}};f(xe,"Internal");ge.service("$internal",{constructor:xe,methods:["middleware"]});var Z=class{#e=Object.create(null);get(e,t){let n=this.#e[t];if(!!n)return n.refs.add(e),n.value}set(e,t,n){let i=this.#e[t];i?i.value=n:i=this.#e[t]={value:n,key:t,refs:new Set},i.refs.add(e)}delete(e){for(let t in this.#e){let{refs:n}=this.#e[t];n.delete(e),n.size||delete this.#e[t]}}};f(Z,"SharedCache");var jn=Ke().version;ee(B,"Config",_.intersect([]));ee(B.Config,"Basic",_.object({locale:_.string().default("zh").description("默认使用的语言。"),prefix:_.union([_.array(String),_.transform(String,m=>[m])]).default([""]).description("指令前缀字符,可以是字符串或字符串数组。将用于指令前缀的匹配。"),nickname:_.union([_.array(String),_.transform(String,m=>[m])]).description("机器人的昵称,可以是字符串或字符串数组。将用于指令前缀的匹配。"),autoAssign:_.union([Boolean,Function]).default(!0).description("当获取不到频道数据时,是否使用接受者作为代理者。"),autoAuthorize:_.union([_.natural(),Function]).default(1).description("当获取不到用户数据时默认使用的权限等级。")}).description("基础设置"));ee(B.Config,"Features",_.object({delay:_.object({character:_.natural().role("ms").default(0).description("调用 `session.sendQueued()` 时消息间发送的最小延迟,按前一条消息的字数计算。"),message:_.natural().role("ms").default(.1*be.second).description("调用 `session.sendQueued()` 时消息间发送的最小延迟,按固定值计算。"),cancel:_.natural().role("ms").default(0).description("调用 `session.cancelQueued()` 时默认的延迟。"),broadcast:_.natural().role("ms").default(.5*be.second).description("调用 `bot.broadcast()` 时默认的延迟。"),prompt:_.natural().role("ms").default(be.minute).description("调用 `session.prompt()` 时默认的等待时间。")})}).description("消息设置"));ee(B.Config,"Advanced",_.object({prettyErrors:_.boolean().default(!0).description("启用报错优化模式。在此模式下 Koishi 会对程序抛出的异常进行整理,过滤掉框架内部的调用记录,输出更易读的提示信息。"),maxListeners:_.natural().default(64).description("每种监听器的最大数量。如果超过这个数量,Koishi 会认定为发生了内存泄漏,将产生一个警告。")}).description("高级设置"));B.Config.list.push(B.Config.Basic,B.Config.Features,B.Config.Advanced);function Bn(m){return m}f(Bn,"defineConfig");export{N as Adapter,K as Argv,j as Bot,W as Channel,F as Command,Q as Commander,J as DatabaseService,ne as I18n,xe as Internal,U as Next,re as SelectorService,Y as Session,Z as SharedCache,X as User,Bn as defineConfig,Pt as defineDriver,De as getSessionId,jn as version}; | ||
var me=Object.defineProperty;var Ke=(m,e,t)=>e in m?me(m,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):m[e]=t;var h=(m,e)=>me(m,"name",{value:e,configurable:!0});var q=(m,e)=>()=>(e||m((e={exports:{}}).exports,e),e.exports);var U=(m,e,t)=>(Ke(m,typeof e!="symbol"?e+"":e,t),t);var Te=q((Tn,et)=>{et.exports={general:{name:"中文",paren:"({0})",quote:"“{0}”",comma:",",and:"和",or:"或",day:"天",hour:"小时",minute:"分钟",second:"秒"},internal:{"low-authority":"权限不足。","insufficient-arguments":"缺少参数,输入帮助以查看用法。","redunant-arguments":"存在多余参数,输入帮助以查看用法。","invalid-argument":"参数 {0} 输入无效,{1}","unknown-option":"存在未知选项 {0},输入帮助以查看用法。","invalid-option":"选项 {0} 输入无效,{1}","check-syntax":"输入帮助以查看用法。","invalid-number":"请提供一个数字。","invalid-integer":"请提供一个整数。","invalid-posint":"请提供一个正整数。","invalid-natural":"请提供一个非负整数。","invalid-date":"请输入合法的时间。","invalid-user":"请指定正确的用户。","invalid-channel":"请指定正确的频道。"}}});var Ae=q((An,tt)=>{tt.exports={general:{name:"English",paren:" ({0}) ",quote:'"{0}"',comma:", ",and:"and",or:"or",day:"day",hour:"hour",minute:"minute",second:"second"},internal:{"low-authority":"Low authority.","insufficient-arguments":"Insufficient arguments, type help to see usage.","redunant-arguments":"Redunant arguments, type help to see usage.","invalid-argument":"Invalid argument {0}, {1}","unknown-option":"Unknown option {0}, type help to see usage.","invalid-option":"Invalid option {0}, {1}","check-syntax":"Type help to see usage.","invalid-number":"Expect a number.","invalid-integer":"Expect an integer.","invalid-posint":"Expect a positive integer.","invalid-natural":"Expect a non-negative integer.","invalid-date":"Expect a valid date.","invalid-user":"Expect a valid user.","invalid-channel":"Expect a valid channel."}}});var ke=q((kn,nt)=>{nt.exports={general:{name:"日本語",paren:"({0})",quote:"「{0}」",comma:"、",and:"と",or:"や",day:"日",hour:"時間",minute:"分",second:"秒"},internal:{"low-authority":"実行できる権限が付与されていません","insufficient-arguments":"パラメータが不足しています、「help」を送信して使い方を確認してください。","redunant-arguments":"パラメータ数が多すぎます、「help」を送信して使い方を確認してください。","invalid-argument":"無効なパラメータ「{0}」、{1}","unknown-option":"未知なオプション「{0}」、「help」を送信して使い方を確認してください。","invalid-option":"無効なオプション「{0}」、{1}","check-syntax":"「help」を送信して使い方を検索してください。","invalid-number":"数字を指定してください。","invalid-integer":"整数を指定してください。","invalid-posint":"正の整数を指定してください。","invalid-natural":"自然数を指定してください。","invalid-date":"日付を指定してください。","invalid-user":"ユーザー名を指定してください。","invalid-channel":"チャンネル名を指定してください。"}}});var Ee=q((En,rt)=>{rt.exports={general:{name:"francais",paren:" ({0}) ",quote:'"{0}"',comma:", ",and:"et",or:"ou",day:"jour",hour:"heure",minute:"minute",second:"seconde"},internal:{"low-authority":"Droits insuffisants.","insufficient-arguments":`Arguments insuffisants, tapez "help" pour afficher l'aide`,"redunant-arguments":`Arguments redondants, tapez "help" pour afficher l'aide`,"invalid-argument":"Arguments {0} invalides, {1}","unknown-option":`Option {0} inconnue, tapez "help" pour afficher l'aide`,"invalid-option":"Option {0} invalide, {1}","check-syntax":`Tapez "help" pour afficher l'aide`,"invalid-number":"Entrez un nombre.","invalid-integer":"Entrez un entier.","invalid-posint":"Entrez un entier positif.","invalid-natural":"Entrez un entier non négatif.","invalid-date":"Entrez une date valide.","invalid-user":"Entrez un nom d'utilisateur valide.","invalid-channel":"Entrez un nom de canal valide."}}});var $e=q(($n,it)=>{it.exports={general:{name:"中文",paren:"({0})",quote:"「{0}」",comma:",",and:"和",or:"或",day:"天",hour:"小時",minute:"分鐘",second:"秒"},internal:{"low-authority":"權限不足。","insufficient-arguments":"參數個數不足,輸入「help」檢視用法。","redunant-arguments":"參數個數冗餘,輸入「help」檢視用法。","invalid-argument":"參數 {0} 無效,{1}","unknown-option":"存在未知選項 {0},輸入「help」檢視用法。","invalid-option":"選項 {0} 無效,{1}","check-syntax":"輸入「help」檢視用法。","invalid-number":"請輸入有效數字。","invalid-integer":"請輸入有效整數。","invalid-posint":"請輸入有效正整數。","invalid-natural":"請輸入有效非負整數。","invalid-date":"請輸入有效時間。","invalid-user":"請指定有效用戶。","invalid-channel":"請指定有效頻道。"}}});var Fe=q((Pn,at)=>{at.exports={name:"@koishijs/core",description:"Core Features for Koishi",version:"4.8.0",main:"lib/node.js",module:"lib/browser.js",typings:"lib/index.d.ts",files:["lib"],author:"Shigma <shigma10826@gmail.com>",license:"MIT",repository:{type:"git",url:"git+https://github.com/koishijs/koishi.git",directory:"packages/core"},bugs:{url:"https://github.com/koishijs/koishi/issues"},homepage:"https://koishi.js.org",keywords:["bot","chatbot","koishi"],devDependencies:{chai:"^4.3.6","chai-as-promised":"^7.1.1","chai-shape":"^1.0.0"},dependencies:{"@koishijs/utils":"^6.0.0","@satorijs/core":"^1.0.2",cordis:"^2.0.6","fastest-levenshtein":"^1.0.12",minato:"^1.2.3"}}});export*from"@koishijs/utils";export*from"minato";import{defineProperty as Ue,Logger as Ie,remove as Re}from"@koishijs/utils";import{defineProperty as J,Schema as w,Time as Z}from"@koishijs/utils";import*as he from"@satorijs/core";import*as fe from"cordis";import{Disposable as ft}from"cordis";var pt=fe.Service,y=class extends he.Context{constructor(e){super(e)}get app(){return this.root}};h(y,"Context");(e=>(e.Config=w.intersect([]),J(e.Config,"Basic",w.object({locale:w.string().default("zh").description("默认使用的语言。"),prefix:w.union([w.array(String),w.transform(String,t=>[t])]).default([""]).description("指令前缀字符,可以是字符串或字符串数组。将用于指令前缀的匹配。"),nickname:w.union([w.array(String),w.transform(String,t=>[t])]).description("机器人的昵称,可以是字符串或字符串数组。将用于指令前缀的匹配。"),autoAssign:w.union([Boolean,Function]).default(!0).description("当获取不到频道数据时,是否使用接受者作为代理者。"),autoAuthorize:w.union([w.natural(),Function]).default(1).description("当获取不到用户数据时默认使用的权限等级。")}).description("基础设置")),J(e.Config,"Message",w.object({delay:w.object({character:w.natural().role("ms").default(0).description("调用 `session.sendQueued()` 时消息间发送的最小延迟,按前一条消息的字数计算。"),message:w.natural().role("ms").default(.1*Z.second).description("调用 `session.sendQueued()` 时消息间发送的最小延迟,按固定值计算。"),cancel:w.natural().role("ms").default(0).description("调用 `session.cancelQueued()` 时默认的延迟。"),broadcast:w.natural().role("ms").default(.5*Z.second).description("调用 `bot.broadcast()` 时默认的延迟。"),prompt:w.natural().role("ms").default(Z.minute).description("调用 `session.prompt()` 时默认的等待时间。")})}).description("消息设置")),J(e.Config,"Advanced",w.object({prettyErrors:w.boolean().default(!0).description("启用报错优化模式。在此模式下 Koishi 会对程序抛出的异常进行整理,过滤掉框架内部的调用记录,输出更易读的提示信息。"),maxListeners:w.natural().default(64).description("每种监听器的最大数量。如果超过这个数量,Koishi 会认定为发生了内存泄漏,将产生一个警告。")}).description("高级设置")),e.Config.list.push(e.Config.Basic,e.Config.Message,e.Config.Advanced)))(y||={});function ut(m){return m}h(ut,"defineConfig");var z=class{constructor(e){this.app=e;Ue(this,y.current,e),e.on("internal/warning",(t,...n)=>{this.logger("app").warn(t,...n)})}get caller(){return this[y.current]}logger(e){return new Ie(e)}async waterfall(...e){let t=typeof e[0]=="object"?e.shift():null,n=e.shift();for(let r of this.app.lifecycle.getHooks(n,t)){let i=await r.apply(t,e);e[0]=i}return e[0]}chain(...e){let t=typeof e[0]=="object"?e.shift():null,n=e.shift();for(let r of this.app.lifecycle.getHooks(n,t)){let i=r.apply(t,e);e[0]=i}return e[0]}before(e,t,n=!1){let r=e.split("/");return r[r.length-1]="before-"+r[r.length-1],this.caller.on(r.join("/"),t,!n)}createTimerDispose(e){let t=h(()=>{if(clearTimeout(e),!!this.caller.state)return Re(this.caller.state.disposables,t)},"dispose");return this.caller.state.disposables.push(t),t}setTimeout(e,t,...n){let r=this.createTimerDispose(setTimeout(()=>{r(),e()},t,...n));return r}setInterval(e,t,...n){return this.createTimerDispose(setInterval(e,t,...n))}};h(z,"SelectorService"),U(z,"methods",["chain","waterfall","before","logger","setTimeout","setInterval"]);y.service("selector",z);import{makeArray as Je,sleep as Ze}from"@koishijs/utils";import{defineProperty as N,isNullable as Ve,Logger as Xe,makeArray as Ye,observe as ce}from"@koishijs/utils";import*as X from"@satorijs/core";import{defineProperty as Qe}from"@koishijs/utils";import{coerce as Be,Logger as ze,remove as j,Schema as Q}from"@koishijs/utils";import{camelCase as ge,escapeRegExp as xe,paramCase as ye,Time as Me}from"@koishijs/utils";import{segment as ee}from"@satorijs/core";var te=`"'“‘`,ne=`"'”’`,R;(E=>{let m={};function e(o,s,c){m[o]={terminator:s,parse:c}}E.interpolate=e,h(e,"interpolate"),e("$(",")");class t{bracs;constructor(){this.bracs=Object.create(m)}interpolate(s,c,u){this.bracs[s]={terminator:c,parse:u}}parseToken(s,c="$"){let u={inters:[]},f=te.indexOf(s[0]),C=ne[f],A="";C&&(s=s.slice(1),c=`${C}(?=${c})|$`),c+=`|${Object.keys({...this.bracs,...m}).map(xe).join("|")}`;let x=new RegExp(c);for(;;){let b=x.exec(s);if(A+=s.slice(0,b.index),b[0]in this.bracs){s=s.slice(b.index+b[0].length).trimStart();let{parse:S,terminator:P}=this.bracs[b[0]],$=S?.(s)||this.parse(s,P);s=$.rest,u.inters.push({...$,pos:A.length,initiator:b[0]})}else{let S=b[0]===C,P=s.slice(b.index+ +S);return u.rest=P.trimStart(),u.quoted=S,u.terminator=b[0],S?u.terminator+=P.slice(0,-u.rest.length):C&&(A=te[f]+A,u.inters.forEach($=>$.pos+=1)),u.content=A,C==="'"&&E.revert(u),u}}}parse(s,c=""){let u=[],f=s,C="",A=`\\s+|[${xe(c)}]|$`;for(;f&&!(c&&f.startsWith(c));){let x=this.parseToken(f,A);u.push(x),f=x.rest,C=x.terminator,delete x.rest}return f.startsWith(c)&&(f=f.slice(1)),s=s.slice(0,-(f+C).length),{tokens:u,rest:f,source:s}}stringify(s){let c=s.tokens.reduce((u,f)=>(f.quoted&&(u+=te[ne.indexOf(f.terminator[0])]||""),u+f.content+f.terminator),"");return s.rest&&!ne.includes(c[c.length-1])||s.initiator?c.slice(0,-1):c}}h(t,"Tokenizer"),E.Tokenizer=t;let n=new t;function r(o,s=""){return n.parse(o,s)}E.parse=r,h(r,"parse");function i(o){return n.stringify(o)}E.stringify=i,h(i,"stringify");function l(o){for(;o.inters.length;){let{pos:s,source:c,initiator:u}=o.inters.pop();o.content=o.content.slice(0,s)+u+c+m[u].terminator+o.content.slice(s)}}E.revert=l,h(l,"revert");function d(o){return typeof o=="string"?p[o]||{}:{}}h(d,"resolveConfig");function a(o){return typeof o=="function"?o:o instanceof RegExp?s=>{if(o.test(s))return s;throw new Error}:Array.isArray(o)?s=>{if(o.includes(s))return s;throw new Error}:p[o]?.transform}h(a,"resolveType");let p={};function g(o,s,c){p[o]={...c,transform:s}}E.createDomain=g,h(g,"createDomain"),g("rawtext",o=>o),g("string",o=>o),g("text",o=>o,{greedy:!0}),g("rawtext",o=>ee.unescape(o),{greedy:!0}),g("boolean",()=>!0),g("number",(o,s)=>{let c=+o;if(Number.isFinite(c))return c;throw new Error("internal.invalid-number")}),g("integer",(o,s)=>{let c=+o;if(c*0===0&&Math.floor(c)===c)return c;throw new Error("internal.invalid-integer")}),g("posint",(o,s)=>{let c=+o;if(c*0===0&&Math.floor(c)===c&&c>0)return c;throw new Error("internal.invalid-posint")}),g("natural",(o,s)=>{let c=+o;if(c*0===0&&Math.floor(c)===c&&c>=0)return c;throw new Error("internal.invalid-natural")}),g("date",(o,s)=>{let c=Me.parseDate(o);if(+c)return c;throw new Error("internal.invalid-date")}),g("user",(o,s)=>{if(o.startsWith("@"))return o=o.slice(1),o.includes(":")?o:`${s.platform}:${o}`;let c=ee.from(o);if(c&&c.type==="at")return`${s.platform}:${c.data.id}`;throw new Error("internal.invalid-user")}),g("channel",(o,s)=>{if(o.startsWith("#"))return o=o.slice(1),o.includes(":")?o:`${s.platform}:${o}`;let c=ee.from(o);if(c&&c.type==="sharp")return`${s.platform}:${c.data.id}`;throw new Error("internal.invalid-channel")});let _=/<[^>]+>|\[[^\]]+\]/g;function T(o){let s,c=[];for(;s=_.exec(o);){let u=s[0].slice(1,-1),f=!1;u.startsWith("...")&&(u=u.slice(3),f=!0);let[C,A]=u.split(":"),x=A?A.trim():void 0;c.push({name:C,variadic:f,type:x,required:s[0][0]==="<"})}return c.stripped=o.replace(/:[\w-]+[>\]]/g,u=>u.slice(-1)).trimEnd(),c}h(T,"parseDecl");function I(o,s,c,u,f={}){let{name:C,type:A,fallback:x}=f,b=o===""&&!s;if(b&&x!==void 0)return x;let S=a(A);if(S)try{return S(o,u.session)}catch($){if(!u.session)u.error=`internal.invalid-${c}`;else{let O=u.session.text($.message||"internal.check-syntax");u.error=u.session.text(`internal.invalid-${c}`,[C,O])}return}if(b)return!0;if(s)return o;let P=+o;return P*0===0?P:o}E.parseValue=I,h(I,"parseValue");class F{constructor(s,c,u){this.name=s;this.ctx=u;if(!s)throw new Error("expect a command name");let f=this._arguments=T(c);this.declaration=f.stripped}declaration;_arguments;_options={};_namedOptions={};_symbolicOptions={};_createOption(s,c,u){let f=ye(s),C=c.replace(/(?<=^|\s)[\w\x80-\uffff].*/,""),A=c.slice(C.length),x=C.replace(/(?<=^|\s)(<[^<]+>|\[[^[]+\]).*/,""),b=C.slice(x.length);x=x.trim()||"--"+f;let S=[],P=[];for(let k of x.trim().split(",")){k=k.trimStart();let B=k.replace(/^-+/,"");!B||!k.startsWith("-")?P.push(k):S.push(B)}!("value"in u)&&!S.includes(f)&&(x+=", --"+f);let $=T(b);$.stripped&&(x+=" "+$.stripped);let O=this._options[s]||={...K.defaultOptionConfig,...$[0],...u,name:s,values:{},valuesSyntax:{},syntax:x},v=`commands.${this.name}.options.${s}`,D=typeof O.fallback;"value"in u?(v+="."+u.value,O.valuesSyntax[u.value]=x,S.forEach(k=>O.values[k]=u.value)):b.trim()?!O.type&&(D==="string"||D==="number")&&(O.type=D):O.type="boolean",A&&this.ctx.i18n.define("",v,A),this._assignOption(O,S,this._namedOptions),this._assignOption(O,P,this._symbolicOptions),this._namedOptions[f]||(this._namedOptions[f]=O)}_assignOption(s,c,u){for(let f of c){if(f in u)throw new Error(`duplicate option name "${f}" for command "${this.name}"`);u[f]=s}}removeOption(s){if(!this._options[s])return!1;let c=this._options[s];delete this._options[s];for(let u in this._namedOptions)this._namedOptions[u]===c&&delete this._namedOptions[u];for(let u in this._symbolicOptions)this._symbolicOptions[u]===c&&delete this._symbolicOptions[u];return!0}parse(s,c,u=[],f={}){typeof s=="string"&&(s=E.parse(s,c));let C=this.name+" "+E.stringify(s);for(;!s.error&&s.tokens.length;){let A=s.tokens[0],{content:x,quoted:b}=A,S=this._arguments[u.length];if(x[0]!=="-"&&d(S?.type).greedy){u.push(E.parseValue(E.stringify(s),!0,"argument",s,S));break}s.tokens.shift();let P,$,O;if(!b&&(P=this._symbolicOptions[x]))$=[ye(P.name)];else{if(x[0]!=="-"||b){u.push(E.parseValue(x,b,"argument",s,S||{type:"string"}));continue}let v=0,D;for(;v<x.length&&x.charCodeAt(v)===45;++v);if(x.slice(v,v+3)==="no-"&&!this._namedOptions[x.slice(v)]){D=x.slice(v+3),f[ge(D)]=!1;continue}let k=v+1;for(;k<x.length&&x.charCodeAt(k)!==61;k++);D=x.slice(v,k),$=v>1?[D]:D,O=x.slice(++k),P=this._namedOptions[$[$.length-1]]}if(b=!1,!O){let{type:v}=P||{};if(d(v).greedy)O=E.stringify(s),b=!0,s.tokens=[];else if(v!=="boolean"&&s.tokens.length&&(v||s.tokens[0]?.content!=="-")){let D=s.tokens.shift();O=D.content,b=D.quoted}}for(let v=0;v<$.length;v++){let D=$[v],k=this._namedOptions[D],B=k?k.name:ge(D);if(k&&D in k.values)f[B]=k.values[D];else{let Pe=v+1<$.length?"":O;f[B]=E.parseValue(Pe,b,"option",s,k)}if(s.error)break}}for(let{name:A,fallback:x}of Object.values(this._options))x!==void 0&&!(A in f)&&(f[A]=x);return delete s.tokens,{options:f,args:u,source:C,rest:s.rest,error:s.error||""}}stringifyArg(s){return s=""+s,s.includes(" ")?`"${s}"`:s}stringify(s,c){let u=this.name;for(let f in c){let C=c[f];C===!0?u+=` --${f}`:C===!1?u+=` --no-${f}`:u+=` --${f} ${this.stringifyArg(C)}`}for(let f of s)u+=" "+this.stringifyArg(f);return u}}h(F,"CommandBase"),E.CommandBase=F})(R||={});import{coerce as Ge,defineProperty as Ce,escapeRegExp as qe,makeArray as Le}from"@koishijs/utils";import{defineProperty as je}from"@koishijs/utils";import{Database as be}from"minato";var re;(t=>{let m;(r=>r[r.ignore=1]="ignore")(m=t.Flag||={}),t.fields=[]})(re||={});var ie;(t=>{let m;(i=>(i[i.ignore=1]="ignore",i[i.silent=4]="silent"))(m=t.Flag||={}),t.fields=[]})(ie||={});var L=class extends be{constructor(t){super();this.app=t;je(this,y.current,t),this.extend("user",{id:"string(63)",name:{type:"string",length:63},flag:"unsigned(20)",authority:"unsigned(4)",locale:"string(63)"},{autoInc:!0}),this.extend("channel",{id:"string(63)",platform:"string(63)",flag:"unsigned(20)",assignee:"string(63)",guildId:"string(63)",locale:"string(63)"},{primary:["id","platform"]}),t.on("bot-added",n=>{n.platform in this.tables.user.fields||this.extend("user",{[n.platform]:{type:"string",length:63}},{unique:[n.platform]})})}async getUser(t,n,r){let i=await this.get("user",{[t]:n},r);return Array.isArray(n)?i:(i[0]&&Object.assign(i[0],{[t]:n}),i[0])}setUser(t,n,r){return this.set("user",{[t]:n},r)}createUser(t,n,r){return this.create("user",{[t]:n,...r})}async getChannel(t,n,r){let i=await this.get("channel",{platform:t,id:n},r);return Array.isArray(n)?i:(i[0]&&Object.assign(i[0],{platform:t,id:n}),i[0])}getSelfIds(t,n){if(t)return n||=this.app.bots.filter(i=>i.platform===t).map(i=>i.selfId),{[t]:n};let r={};for(let i of this.app.bots)(r[i.platform]||=[]).push(i.selfId);return r}async getAssignedChannels(t,n=this.getSelfIds()){return this.get("channel",{$or:Object.entries(n).map(([r,i])=>({platform:r,assignee:i}))},t)}setChannel(t,n,r){return this.set("channel",{platform:t,id:n},r)}createChannel(t,n,r){return this.create("channel",{platform:t,id:n,...r})}async broadcast(...t){let n;Array.isArray(t[0])&&(n=t.shift());let[r,i]=t;if(!r)return[];let l=await this.getAssignedChannels(["id","assignee","flag","platform","guildId"]),d={};for(let{id:a,assignee:p,flag:g,platform:_,guildId:T}of l)n&&!n.includes(`${_}:${a}`)||!i&&g&4||((d[_]||={})[p]||=[]).push([a,T]);return(await Promise.all(Object.entries(d).flatMap(([a,p])=>this.app.bots.map(g=>g.platform!==a?Promise.resolve([]):g.broadcast(p[g.selfId]||[],r))))).flat(1)}};h(L,"DatabaseService"),U(L,"methods",["getSelfIds","broadcast"]);L.prototype.extend=h(function(e,t,n){be.prototype.extend.call(this,e,t,{...n,driver:this[y.current].mapping.database}),this.app.emit("model",e)},"extend");y.service("database");y.service("model",L);var Ut=h((m,e,t)=>({name:m.name,reusable:!0,Config:e,apply(n,r){t?.(n,r);let i=new m(n.model,r),l=n.mapping.database||"default";n.on("ready",async()=>{await i.start(),n.model.drivers[l]=i,n.model.refresh();let d=Object.create(n.model);n.database=d}),n.on("dispose",async()=>{n.database=null,delete n.model.drivers[l],await i.stop()})}}),"defineDriver");function Ne(m,e="",t=""){return m.length?new RegExp(`^${e}(${m.map(qe).join("|")})${t}`):/$^/}h(Ne,"createLeadingRE");var M;(t=>{t.MAX_DEPTH=64;async function e(n,r){return typeof n=="function"?n(r):n}t.compose=e,h(e,"compose")})(M||={});var W=class{constructor(e,t){this.ctx=e;this.config=t;Ce(this,y.current,e),this.prepare(),this.middleware(this._process.bind(this)),e.on("message",this._handleMessage.bind(this)),e.before("attach-user",(n,r)=>{n.collect("user",n.argv,r)}),e.before("attach-channel",(n,r)=>{n.collect("channel",n.argv,r)}),this.middleware((n,r)=>n.resolve(n.argv)?n.execute(n.argv,r):r())}_hooks=[];_nameRE;_sessions=Object.create(null);_userCache=new H;_channelCache=new H;get caller(){return this[y.current]}middleware(e,t=!1){return this.caller.lifecycle.register("middleware",this._hooks,e,t)}prepare(){this._nameRE=Ne(Le(this.config.nickname),"@?","([,,]\\s*|\\s+)")}_resolvePrefixes(e){let t=e.resolveValue(this.config.prefix);return Array.isArray(t)?t:[t||""]}async _process(e,t){let n,r=!1,i=!1,l=null,d=/^\[CQ:(\w+)((,\w+=[^,\]]*)*)\]/,a=await e.preprocess();e.subtype!=="private"&&(n=a.match(d))&&n[1]==="at"&&n[2].includes("id="+e.selfId)?(r=i=!0,a=a.slice(n[0].length).trimStart()):(n=a.match(this._nameRE))&&(i=!0,a=a.slice(n[0].length));for(let p of this._resolvePrefixes(e))!a.startsWith(p)||(l=p,a=a.slice(p.length));if(Ce(e,"parsed",{content:a,appel:i,prefix:l}),this.ctx.emit(e,"before-attach",e),this.ctx.database){if(e.subtype==="group"){let _=new Set(["flag","assignee","guildId","locale"]);this.ctx.emit("before-attach-channel",e,_);let T=await e.observeChannel(_);if(T.guildId=e.guildId,await this.ctx.serial(e,"attach-channel",e)||T.flag&ie.Flag.ignore||T.assignee!==e.selfId&&!r)return}let p=new Set(["flag","authority","locale"]);this.ctx.emit("before-attach-user",e,p);let g=await e.observeUser(p);if(await this.ctx.serial(e,"attach-user",e)||g.flag&re.Flag.ignore)return}return this.ctx.emit(e,"attach",e),t()}async _handleMessage(e){if(e.selfId===e.userId)return;this._sessions[e.id]=e;let t=this._hooks.filter(([a])=>a.filter(e)).map(([,a])=>a.bind(null,e)),n=0,r="",i="",{prettyErrors:l}=this.ctx.options,d=h(async a=>{if(l&&(i=new Error().stack.split(` | ||
`,3)[2],n)){let p=i.match(/\((.+)\)/);r=` | ||
- ${p?p[1]:i.slice(7)}${r}`}try{if(!this._sessions[e.id])throw new Error("isolated next function detected");if(a!==void 0&&(t.push(p=>M.compose(a,p)),t.length>M.MAX_DEPTH))throw new Error(`middleware stack exceeded ${M.MAX_DEPTH}`);return await t[n++]?.(d)}catch(p){let g=Ge(p);if(l){let _=g.indexOf(i);_>=0?g=g.slice(0,_):g+=` | ||
`,g+=`Middleware stack:${r}`}this.ctx.logger("session").warn(`${e.content} | ||
${g}`)}},"next");try{let a=await d();a&&await e.send(a)}finally{delete this._sessions[e.id],this.ctx.emit(e,"middleware",e),this._userCache.delete(e.id),this._channelCache.delete(e.id),await e.user?.$update(),await e.channel?.$update(),await e.guild?.$update()}}};h(W,"Internal"),U(W,"methods",["middleware"]);y.service("$internal",W);var H=class{#e=Object.create(null);get(e,t){let n=this.#e[t];if(!!n)return n.refs.add(e),n.value}set(e,t,n){let r=this.#e[t];r?r.value=n:r=this.#e[t]={value:n,key:t,refs:new Set},r.refs.add(e)}delete(e){for(let t in this.#e){let{refs:n}=this.#e[t];n.delete(e),n.size||delete this.#e[t]}}};h(H,"SharedCache");var se=new ze("command"),oe=class extends R.CommandBase{config;children=[];parent=null;_aliases=[];_examples=[];_usage;_disposed;_disposables;_userFields=[["locale"]];_channelFields=[["locale"]];_actions=[];_checkers=[async e=>this.ctx.serial(e.session,"command/before-execute",e)];static userFields(e){return this._userFields.push(e),this}static channelFields(e){return this._channelFields.push(e),this}constructor(e,t,n){super(e,t,n),this.config={...oe.defaultConfig},this._registerAlias(e),n.$commander._commandList.push(this)}get displayName(){return this._aliases[0]}set displayName(e){this._registerAlias(e,!0)}_registerAlias(e,t=!1){if(e=e.toLowerCase(),this._aliases.includes(e)){t&&(j(this._aliases,e),this._aliases.unshift(e));return}else t?this._aliases.unshift(e):this._aliases.push(e);let r=this.ctx.$commander.getCommand(e);if(!r)this.ctx.$commander._commands.set(e,this);else if(r!==this)throw new Error(`duplicate command names: "${e}"`);this._disposables?.push(()=>{j(this._aliases,e),this.ctx.$commander._commands.delete(e)})}[Symbol.for("nodejs.util.inspect.custom")](){return`Command <${this.name}>`}userFields(e){return this._userFields.push(e),this}channelFields(e){return this._channelFields.push(e),this}alias(...e){if(this._disposed)return this;for(let t of e)this._registerAlias(t);return this}shortcut(e,t={}){return this._disposed?this:(t.name=e,t.command=this,this.ctx.$commander._shortcuts.push(t),this._disposables?.push(()=>j(this.ctx.$commander._shortcuts,t)),this)}subcommand(e,...t){e=this.name+(e.charCodeAt(0)===46?"":"/")+e;let n=typeof t[0]=="string"?t.shift():"",r=t[0]||{};return this._disposed&&(r.patch=!0),this.ctx.command(e,n,r)}usage(e){return this._usage=e,this}example(e){return this._examples.push(e),this}option(e,...t){let n="";typeof t[0]=="string"&&(n=t.shift());let r=t[0];return this._createOption(e,n,r||{}),this._disposables?.push(()=>this.removeOption(e)),this}match(e){let{authority:t=1/0}=e.user||{};return this.ctx.filter(e)&&this.config.authority<=t}getConfig(e,t){let n=this.config[e];return typeof n=="function"?n(t):n}check(e,t=!1){return this.before(e,t)}before(e,t=!1){return t?this._checkers.push(e):this._checkers.unshift(e),this._disposables?.push(()=>j(this._checkers,e)),this}action(e,t=!1){return t?this._actions.unshift(e):this._actions.push(e),this._disposables?.push(()=>j(this._actions,e)),this}use(e,...t){return e(this,...t)}async execute(e,t=M.compose){e.command??=this,e.args??=[],e.options??={};let{args:n,options:r,error:i}=e;if(i)return i;se.level>=3&&se.debug(e.source||=this.stringify(n,r));for(let p of this._checkers){let g=await p.call(this,e,...n);if(typeof g=="string")return g}if(!this._actions.length)return"";let l=0,d=this._actions.map(p=>async()=>await p.call(this,e,...n));d.push(t);let a=d.length;e.next=async p=>{if(p!==void 0&&(d.push(g=>M.compose(p,g)),d.length>M.MAX_DEPTH))throw new Error(`middleware stack exceeded ${M.MAX_DEPTH}`);return d[l++]?.(e.next)};try{let p=await e.next();if(typeof p=="string")return p}catch(p){if(l===a)throw p;let g=Be(p);se.warn(`${e.source||=this.stringify(n,r)} | ||
${g}`),this.ctx.emit(e.session,"command-error",e,p)}return""}dispose(){this._disposed=!0,this.ctx.emit("command-removed",this);for(let e of this.children.slice())e.dispose();this.ctx.$commander._shortcuts=this.ctx.$commander._shortcuts.filter(e=>e.command!==this),this._aliases.forEach(e=>this.ctx.$commander._commands.delete(e)),j(this.ctx.$commander._commandList,this),this.parent&&j(this.parent.children,this)}},K=oe;h(K,"Command"),U(K,"defaultConfig",{authority:1,showWarning:!0}),U(K,"defaultOptionConfig",{authority:0}),U(K,"_userFields",[]),U(K,"_channelFields",[]);(e=>e.Config=Q.object({authority:Q.natural().default(1),hidden:Q.boolean().default(!1),checkArgCount:Q.boolean().default(!1),checkUnknown:Q.boolean().default(!1)}))(K||={});import{defineProperty as We,valueMap as He}from"@koishijs/utils";function ae(m){m.before("parse",(t,n)=>{let r=R.parse(t);return n.quote&&r.tokens.push({content:n.quote.content,quoted:!0,inters:[],terminator:""}),r}),m.before("parse",(t,n)=>{let{parsed:r,quote:i}=n;if(!(r.prefix||i))for(let l of m.$commander._shortcuts){let{name:d,fuzzy:a,command:p,prefix:g,options:_={},args:T=[]}=l;if(!(g&&!r.appel||!p.ctx.filter(n)))if(typeof d=="string"){if(!a&&t!==d||!t.startsWith(d))continue;let I=t.slice(d.length);if(a&&!r.appel&&I.match(/^\S/))continue;let F=R.parse(I.trim());return F.session=n,F=p.parse(F,"",[...T],{..._}),F.command=p,F}else{let F=function(E){return typeof E!="string"?E:(E=E.replace(/\$\$/g,"@@__PLACEHOLDER__@@"),I.forEach((o,s)=>{!s||s>9||(E=E.replace(new RegExp(`\\$${s}`,"g"),(o||"").replace(/\$/g,"@@__PLACEHOLDER__@@")))}),E.replace(/@@__PLACEHOLDER__@@/g,"$"))};h(F,"escape");let I=d.exec(t);if(!I)continue;return{command:p,args:T.map(F),options:He(_,F)}}}}),m.before("attach",t=>{We(t,"argv",m.bail("before-parse",t.parsed.content,t)),t.argv.root=!0,t.argv.session=t});function e(t,n){if(!!m.$commander.getCommand("help"))return t.execute({name:"help",args:[n]})}h(e,"executeHelp"),m.before("command/execute",t=>{let{args:n,command:r,options:i,session:l}=t;if(i.help&&r._options.help)return e(l,r.name);if(r._actions.length)return;let d=n.shift()||"",a=m.$commander.getCommand(r.name+"."+d);if(a){let p=l.__redirected_commands||=[`(${r.name}${r._aliases.length!==0?"|"+r._aliases.join("|"):""})`];p.push(d);let g=new RegExp(`^${p.join("[. ]")}( |$)`);return t=R.parse(l.parsed.content.replace(g,"")),t.session=l,t=a.parse(t),l.execute({...t,command:a})}else return e(l,r.name)})}h(ae,"runtime");function le(m){m.on("command-added",e=>{e.userFields(({tokens:t,command:n,options:r={}},i)=>{if(!n)return;let{authority:l}=n.config,d=l>0;for(let{name:a,authority:p}of Object.values(n._options))a in r?p>0&&(d=!0):t&&p>0&&(d=!0);d&&i.add("authority")})}),m.before("command/execute",e=>{let{session:t,options:n,command:r}=e;if(!t.user)return;function i(l,...d){return r.config.showWarning?t.text(l,d):""}if(h(i,"sendHint"),t.user.authority&&r.getConfig("authority",t)>t.user.authority)return i("internal.low-authority");for(let l of Object.values(r._options))if(l.name in n&&l.authority>t.user.authority)return i("internal.low-authority")}),m.before("command/execute",e=>{let{args:t,options:n,command:r,session:i}=e;function l(d,...a){return r.config.showWarning?i.text(d,a):""}if(h(l,"sendHint"),r.config.checkArgCount){if((r._arguments[t.length]||{}).required)return l("internal.insufficient-arguments");let a=r._arguments[r._arguments.length-1]||{};if(t.length>r._arguments.length&&a.type!=="text"&&!a.variadic)return l("internal.redunant-arguments")}if(r.config.checkUnknown){let d=Object.keys(n).filter(a=>!r._options[a]);if(d.length)return l("internal.unknown-option",d.join(", "))}})}h(le,"validate");var G=class{constructor(e,t={}){this.ctx=e;this.config=t;Qe(this,y.current,e),e.plugin(ae),e.plugin(le)}_commandList=[];_commands=new Map;_shortcuts=[];get caller(){return this[y.current]}resolve(e){if(!e)return;let t=e.split("."),n=1,r=t[0],i;for(;(i=this.getCommand(r))&&n<t.length;)r=i.name+"."+t[n++];return i}getCommand(e){return this._commands.get(e)}command(e,...t){let n=typeof t[0]=="string"?t.shift():"",r=t[0],i=e.split(" ",1)[0].toLowerCase(),l=e.slice(i.length),d=i.split(/(?=[./])/g),a,p,g=[];if(d.forEach((T,I)=>{let F=T.charCodeAt(0),E=F===46?a.name+T:F===47?T.slice(1):T,o=this.getCommand(E);if(o){if(a){if(o===a)throw new Error(`cannot set a command (${o.name}) as its own subcommand`);if(o.parent){if(o.parent!==a)throw new Error(`cannot create subcommand ${i}: ${o.parent.name}/${o.name} already exists`)}else o.parent=a,a.children.push(o)}return a=o}o=new K(E,l,this.caller),g.push(o),p||(p=o),a&&(o.parent=a,o.config.authority=a.config.authority,a.children.push(o)),a=o}),n&&this.caller.i18n.define("",`commands.${a.name}.description`,n),Object.assign(a.config,r),g.forEach(T=>this.caller.emit("command-added",T)),!r?.patch)return p&&this.caller.state.disposables.unshift(()=>p.dispose()),a;p&&p.dispose();let _=Object.create(a);return _._disposables=this.caller.state.disposables,_}};h(G,"Commander"),U(G,"key","$commander"),U(G,"methods",["command"]);y.service(G.key,G);var de=new Xe("session"),V=class extends X.Session{argv;user;channel;guild;parsed;scope;_promise;_queuedTasks;_queuedTimeout;constructor(e,t){super(e,t),N(this,"scope",null),N(this,"user",null),N(this,"channel",null),N(this,"guild",null),N(this,"_queuedTasks",[]),N(this,"_queuedTimeout",null)}async _preprocess(){let e,t=this.content.trim();return(e=X.segment.from(t,{type:"quote",caret:!0}))&&(t=t.slice(e.capture[0].length).trimStart(),this.quote=await this.bot.getMessage(e.data.channelId||this.channelId,e.data.id).catch(n=>{de.warn(n)})),t}async preprocess(){return this._promise||=this._preprocess()}get username(){let e=this.user&&this.user.name?this.user.name:this.author?this.author.nickname||this.author.username:this.userId;return this.app.chain("appellation",e,this)}async send(e){if(!!e)return this.bot.sendMessage(this.channelId,e,this.guildId).catch(t=>(de.warn(t),[]))}cancelQueued(e=this.app.options.delay.cancel){clearTimeout(this._queuedTimeout),this._queuedTasks=[],this._queuedTimeout=setTimeout(()=>this._next(),e)}_next(){let e=this._queuedTasks.shift();if(!e){this._queuedTimeout=null;return}this.send(e.content).then(e.resolve,e.reject),this._queuedTimeout=setTimeout(()=>this._next(),e.delay)}async sendQueued(e,t){if(!!e){if(Ve(t)){let{message:n,character:r}=this.app.options.delay;t=Math.max(n,r*e.length)}return new Promise((n,r)=>{this._queuedTasks.push({content:e,delay:t,resolve:n,reject:r}),this._queuedTimeout||this._next()})}}resolveValue(e){return typeof e=="function"?Reflect.apply(e,null,[this]):e}async getChannel(e=this.channelId,t=[]){let{app:n,platform:r,guildId:i}=this;if(!t.length)return{platform:r,id:e,guildId:i};let l=await n.database.getChannel(r,e,t);if(l)return l;let d=await this.resolveValue(n.options.autoAssign)?this.selfId:"";if(d)return n.database.createChannel(r,e,{assignee:d,guildId:i});{let a=n.model.tables.channel.create();return Object.assign(a,{platform:r,id:e,guildId:i,$detached:!0}),a}}async _observeChannelLike(e,t=[]){let n=new Set(t),{platform:r}=this,i=`${r}:${e}`,l=this.app.$internal._channelCache.get(this.id,i);if(l){for(let a in l)n.delete(a);if(!n.size)return l}let d=await this.getChannel(e,[...n]);return l=this.app.$internal._channelCache.get(this.id,i),l?l.$merge(d):(l=ce(d,a=>this.app.database.setChannel(r,e,a),`channel ${i}`),this.app.$internal._channelCache.set(this.id,i,l)),l}async observeChannel(e=[]){let t=[this._observeChannelLike(this.channelId,e)];this.channelId!==this.guildId&&t.push(this._observeChannelLike(this.guildId,e));let[n,r=n]=await Promise.all(t);return this.guild=r,this.channel=n,n}async getUser(e=this.userId,t=[]){let{app:n,platform:r}=this;if(!t.length)return{[r]:e};let i=await n.database.getUser(r,e,t);if(i)return i;let l=await this.resolveValue(n.options.autoAuthorize);if(l)return n.database.createUser(r,e,{authority:l});{let d=n.model.tables.user.create();return Object.assign(d,{[r]:e,authority:l,$detached:!0}),d}}async observeUser(e=[]){let t=new Set(e),{userId:n,platform:r}=this,i=this.app.$internal._userCache.get(this.id,this.uid);if(i){for(let d in i)t.delete(d);if(!t.size)return this.user=i}if(this.author?.anonymous){let d=this.app.model.tables.user.create();d[r]=n,d.authority=await this.resolveValue(this.app.options.autoAuthorize);let a=ce(d,()=>Promise.resolve());return this.user=a}let l=await this.getUser(n,[...t]);return i=this.app.$internal._userCache.get(this.id,this.uid),i?i.$merge(l):(i=ce(l,d=>this.app.database.setUser(this.platform,n,d),`user ${this.uid}`),this.app.$internal._userCache.set(this.id,this.uid,i)),this.user=i}async withScope(e,t){let n=this.scope;try{return this.scope=e,await t()}finally{this.scope=n}}text(e,t={}){let n=[this.app.options.locale];n.unshift(this.user?.locale),this.subtype==="group"&&(n.unshift(this.guild?.locale),n.unshift(this.channel?.locale));let r=Ye(e).map(i=>i.startsWith(".")?this.scope?this.scope+i:(this.app.logger("i18n").warn(new Error("missing scope")),""):i);return this.app.i18n.text(n,r,t)}collect(e,t,n=new Set){let r=h(i=>{if(i.session=this,i.tokens)for(let{inters:l}of i.tokens)l.forEach(r);!this.resolve(i)||(this.app.emit(i.session,`command/before-attach-${e}`,i,n),we(i,K[`_${e}Fields`],n),we(i,i.command[`_${e}Fields`],n))},"collect");return r(t),n}inferCommand(e){if(e.command)return e.command;if(e.name)return e.command=this.app.$commander.resolve(e.name);let{parsed:t,subtype:n}=this;if(e.root&&n!=="private"&&t.prefix===null&&!t.appel||!e.tokens.length)return;let r=this.app.$commander.resolve(e.tokens[0].content);if(r)return e.tokens.shift(),e.command=r}resolve(e){if(!!this.inferCommand(e)){if(e.tokens?.every(t=>!t.inters.length)){let{options:t,args:n,error:r}=e.command.parse(e);e.options={...e.options,...t},e.args=[...e.args||[],...n],e.error=r}return e.command}}async execute(e,t){if(typeof e=="string"&&(e=R.parse(e)),e.session=this,e.tokens){for(let i of e.tokens){let{inters:l}=i,d=[];for(let a=0;a<l.length;++a)d.push(await this.execute(l[a],!0));for(let a=l.length-1;a>=0;--a){let{pos:p}=l[a];i.content=i.content.slice(0,p)+d[a]+i.content.slice(p)}i.inters=[]}if(!this.resolve(e))return""}else if(e.command||=this.app.$commander.getCommand(e.name),!e.command)return de.warn(new Error(`cannot find command ${e.name}`)),"";let{command:n}=e;if(!n.ctx.filter(this))return"";this.app.database&&(this.subtype==="group"&&await this.observeChannel(this.collect("channel",e)),await this.observeUser(this.collect("user",e)));let r=!0;return t===!0&&(r=!1,t=void 0),this.withScope(`commands.${n.name}.messages`,async()=>{let i=await n.execute(e,t);return r?(await this.send(i),""):i})}middleware(e){let t=ve(this);return this.app.middleware(async(n,r)=>t&&ve(n)!==t?r():e(n,r),!0)}prompt(e=this.app.options.delay.prompt){return new Promise(t=>{let n=this.middleware(i=>{clearTimeout(r),n(),t(i.content)}),r=setTimeout(()=>{n(),t("")},e)})}};h(V,"Session");function ve(m){return""+m.userId+m.channelId}h(ve,"getSessionId");function we(m,e,t){for(let n of e){if(typeof n=="function"){n(m,t);continue}for(let r of n)t.add(r)}return t}h(we,"collectFields");import*as _e from"@satorijs/core";import{Adapter as Cn,h as vn,Message as wn,segment as _n}from"@satorijs/core";var pe=_e.Bot;pe.prototype.session=h(function(e){return new V(this,e)},"session");pe.prototype.getGuildMemberMap=h(async function(e){let t=await this.getGuildMemberList(e);return Object.fromEntries(t.map(n=>[n.userId,n.nickname||n.username]))},"getGuildMemberMap");pe.prototype.broadcast=h(async function(e,t,n=this.ctx.options.delay.broadcast){let r=[];for(let i=0;i<e.length;i++){i&&n&&await Ze(n);try{let[l,d]=Je(e[i]);r.push(...await this.sendMessage(l,t,d))}catch(l){this.ctx.logger("bot").warn(l)}}return r},"broadcast");import{isNullable as Se,Logger as st,Random as ot,Time as ue}from"@koishijs/utils";var Oe=new st("i18n"),De=Symbol("template"),Y=class{_data={};_formatters={};_presets={};constructor(e){this.define("",{"":""}),this.define("zh",Te()),this.define("en",Ae()),this.define("ja",ke()),this.define("fr",Ee()),this.define("zh-tw",$e()),this.registerBuiltins()}set(e,t,n){if(t.includes("@")||typeof n=="string"){let r=this._data[e],[i,l]=t.slice(0,-1).split("@");l&&(n[De]=l),!Se(r[i])&&!e.startsWith("$")&&Oe.warn("override",e,i),r[i]=n,this[y.current]?.on("dispose",()=>{delete r[i]})}else for(let r in n)this.set(e,t+r+".",n[r])}define(e,...t){this._data[e]||={},typeof t[0]=="string"?this.set(e,t[0]+".",t[1]):this.set(e,"",t[0])}formatter(e,t){this._formatters[e]=t}preset(e,t){this._presets[e]=t}render(e,t,n){if(e!==void 0){if(typeof e!="string"){let r=e[De],i=this._presets[r];if(!i)throw new Error(`Preset "${r}" not found`);return i(e,t,n)}return e.replace(/\{(.+?)\}/g,(r,i)=>{let[l,...d]=i.split("|"),a=l.trim().split("."),p=t;for(let g of a)if(p=p[g],Se(p))return"";for(let g of d){let _=g.trim().match(/(\w+)(?:\((.+)\))?/),T=this._formatters[_[1]];if(!T)throw new Error(`Formatter "${_[1]}" not found`);let I=_[2]?_[2].split(",").map(F=>F.trim()):[];p=T(p,I,n)}return p.toString()})}}text(e,t,n){let r=new Set;for(let i of e)!i||r.add(i);for(let i in this._data)i.startsWith("$")||r.add(i);for(let i of t)for(let l of r)for(let d of["$"+l,l]){let a=this._data[d]?.[i];if(a!==void 0)return this.render(a,n,l)}return Oe.warn("missing",t[0]),t[0]}registerBuiltins(){let e=["day","hour","minute","second"];this.formatter("time",(t,n,r)=>{for(let i=0;i<3;i++){let l=ue[e[i]],d=ue[e[i+1]];if(t>=l-d/2){t+=d/2;let a=Math.floor(t/l)+" "+this.text([r],["general."+e[i]],{});return t%l>d&&(a+=` ${Math.floor(t%l/d)} `+this.text([r],["general."+e[i+1]],{})),a}}return Math.round(t/ue.second)+" "+this.text([r],["general.second"],{})}),this.preset("plural",(t,n,r)=>{let i=n.length in t?n.length:t.length-1;return this.render(t[i],n,r)}),this.preset("random",(t,n,r)=>this.render(ot.pick(t),n,r)),this.preset("list",(t,n,r)=>{let i=Object.entries(n).map(([l,d])=>this.render(t.item,{key:l,value:d},r));return i.unshift(this.render(t.header,n,r)),i.push(this.render(t.footer,n,r)),i.join(` | ||
`).trim()})}};h(Y,"I18n");y.service("i18n",Y);var Kn=Fe().version;export{Cn as Adapter,y as App,R as Argv,pe as Bot,ie as Channel,K as Command,G as Commander,y as Context,L as DatabaseService,ft as Disposable,Y as I18n,W as Internal,wn as Message,M as Next,z as SelectorService,pt as Service,V as Session,H as SharedCache,re as User,ut as defineConfig,Ut as defineDriver,ve as getSessionId,vn as h,_n as segment,Kn as version}; |
import * as utils from '@koishijs/utils'; | ||
import { Dict, Schema, Logger, Promisify } from '@koishijs/utils'; | ||
import * as satori from '@satorijs/core'; | ||
import * as cordis from 'cordis'; | ||
import { Dict, Awaitable, Schema, Logger, Promisify } from '@koishijs/utils'; | ||
import { Database, Driver, Result, Update } from 'minato'; | ||
import { Awaitable, Promisify, Dict } from 'cosmokit'; | ||
import { Disposable, GetEvents, Parameters, ReturnType, ThisType } from 'cordis'; | ||
export interface Events { | ||
'model'(name: keyof Tables): void; | ||
} | ||
export interface Context extends DatabaseService.Mixin { | ||
export interface Context { | ||
database: DatabaseService; | ||
model: DatabaseService; | ||
getSelfIds(type?: string, assignees?: string[]): Dict<string[]>; | ||
broadcast(content: string, forced?: boolean): Promise<string[]>; | ||
broadcast(channels: readonly string[], content: string, forced?: boolean): Promise<string[]>; | ||
} | ||
@@ -48,11 +53,5 @@ export interface User { | ||
} | ||
export namespace DatabaseService { | ||
interface Mixin { | ||
getSelfIds(type?: string, assignees?: string[]): Dict<string[]>; | ||
broadcast(content: string, forced?: boolean): Promise<string[]>; | ||
broadcast(channels: readonly string[], content: string, forced?: boolean): Promise<string[]>; | ||
} | ||
} | ||
export class DatabaseService extends Database<Tables> { | ||
protected app: Context; | ||
static readonly methods: string[]; | ||
constructor(app: Context); | ||
@@ -71,30 +70,60 @@ getUser<T extends string, K extends User.Field>(platform: T, id: string, modifier?: Driver.Cursor<K>): Promise<Result<User, K> & Record<T, string>>; | ||
} | ||
export const defineDriver: <T>(constructor: Driver.Constructor<T>, schema?: utils.Schema<T, T>, prepare?: Plugin.Function<T>) => Plugin.Object<T, any>; | ||
declare const kTemplate: unique symbol; | ||
export const defineDriver: <T>(constructor: Driver.Constructor<T>, schema?: utils.Schema, prepare?: Plugin.Function<T>) => Plugin.Object<T, any>; | ||
export interface Context { | ||
i18n: I18n; | ||
$internal: Internal; | ||
middleware(middleware: Middleware, prepend?: boolean): () => boolean; | ||
} | ||
export namespace I18n { | ||
type Node = string | Store; | ||
interface Store { | ||
[kTemplate]?: string; | ||
[K: string]: Node; | ||
export interface Events { | ||
'before-attach-channel'(session: Session, fields: Set<Channel.Field>): void; | ||
'attach-channel'(session: Session): Awaitable<void | boolean>; | ||
'before-attach-user'(session: Session, fields: Set<User.Field>): void; | ||
'attach-user'(session: Session): Awaitable<void | boolean>; | ||
'before-attach'(session: Session): void; | ||
'attach'(session: Session): void; | ||
'middleware'(session: Session): void; | ||
} | ||
export type Next = (next?: Next.Callback) => Promise<void | string>; | ||
export type Middleware = (session: Session, next: Next) => Awaitable<void | string>; | ||
export namespace Next { | ||
const MAX_DEPTH = 64; | ||
type Queue = ((next?: Next) => Awaitable<void | string>)[]; | ||
type Callback = void | string | ((next?: Next) => Awaitable<void | string>); | ||
function compose(callback: Callback, next?: Next): Promise<string | void>; | ||
} | ||
export namespace Internal { | ||
interface Config { | ||
nickname?: string | string[]; | ||
prefix?: Computed<string | string[]>; | ||
} | ||
type Formatter = (value: any, args: string[], locale: string) => string; | ||
type Renderer = (dict: Dict, params: any, locale: string) => string; | ||
} | ||
export class I18n { | ||
_data: Dict<I18n.Store>; | ||
_formatters: Dict<I18n.Formatter>; | ||
_presets: Dict<I18n.Renderer>; | ||
constructor(ctx: Context); | ||
private set; | ||
define(locale: string, dict: I18n.Store): void; | ||
define(locale: string, key: string, value: I18n.Node): void; | ||
formatter(name: string, callback: I18n.Formatter): void; | ||
preset(name: string, callback: I18n.Renderer): void; | ||
render(value: I18n.Node, params: any, locale: string): string; | ||
text(locales: Iterable<string>, paths: string[], params: object): string; | ||
private registerBuiltins; | ||
export class Internal { | ||
private ctx; | ||
private config; | ||
static readonly methods: string[]; | ||
_hooks: [Context, Middleware][]; | ||
_nameRE: RegExp; | ||
_sessions: Dict<Session>; | ||
_userCache: SharedCache<User.Observed<any>>; | ||
_channelCache: SharedCache<Channel.Observed<any>>; | ||
constructor(ctx: Context, config: Internal.Config); | ||
protected get caller(): any; | ||
middleware(middleware: Middleware, prepend?: boolean): any; | ||
prepare(): void; | ||
private _resolvePrefixes; | ||
private _process; | ||
private _handleMessage; | ||
} | ||
export namespace SharedCache { | ||
interface Entry<T> { | ||
value: T; | ||
key: string; | ||
refs: Set<string>; | ||
} | ||
} | ||
export class SharedCache<T> { | ||
#private; | ||
get(ref: string, key: string): T; | ||
set(ref: string, key: string, value: T): void; | ||
delete(ref: string): void; | ||
} | ||
export interface Token { | ||
@@ -296,4 +325,6 @@ rest?: string; | ||
} | ||
export interface Context extends Commander.Mixin { | ||
export interface Context { | ||
$commander: Commander; | ||
command<D extends string>(def: D, config?: Command.Config): Command<never, never, Argv.ArgumentType<D>>; | ||
command<D extends string>(def: D, desc: string, config?: Command.Config): Command<never, never, Argv.ArgumentType<D>>; | ||
} | ||
@@ -312,6 +343,2 @@ export interface Events { | ||
} | ||
interface Mixin { | ||
command<D extends string>(def: D, config?: Command.Config): Command<never, never, Argv.ArgumentType<D>>; | ||
command<D extends string>(def: D, desc: string, config?: Command.Config): Command<never, never, Argv.ArgumentType<D>>; | ||
} | ||
} | ||
@@ -322,2 +349,3 @@ export class Commander { | ||
static readonly key = "$commander"; | ||
static readonly methods: string[]; | ||
_commandList: Command[]; | ||
@@ -327,3 +355,3 @@ _commands: CommandMap; | ||
constructor(ctx: Context, config?: Commander.Config); | ||
protected get caller(): Context; | ||
protected get caller(): any; | ||
resolve(key: string): Command<never, never, any[], {}>; | ||
@@ -333,213 +361,2 @@ getCommand(name: string): Command<never, never, any[], {}>; | ||
} | ||
export interface Context { | ||
bots: Adapter.BotList; | ||
} | ||
export abstract class Adapter<S extends Bot.BaseConfig = Bot.BaseConfig, T = {}> { | ||
ctx: Context; | ||
config: T; | ||
bots: Bot<S>[]; | ||
platform: string; | ||
protected abstract start(): Awaitable<void>; | ||
protected abstract stop(): Awaitable<void>; | ||
constructor(ctx: Context, config: T); | ||
connect(bot: Bot): Awaitable<void>; | ||
disconnect(bot: Bot): Awaitable<void>; | ||
dispatch(session: Session): void; | ||
} | ||
export namespace Adapter { | ||
interface Constructor<T extends Bot.BaseConfig = Bot.BaseConfig, S = any> { | ||
new (ctx: Context, options?: S): Adapter<T>; | ||
[redirect]?(bot: any): string; | ||
schema?: Schema; | ||
} | ||
const redirect: unique symbol; | ||
const library: Dict<Constructor>; | ||
const configMap: Dict; | ||
type BotConfig<R> = R & { | ||
bots?: R[]; | ||
}; | ||
type PluginConfig<S = any, R = any> = S & BotConfig<R>; | ||
function join(platform: string, protocol: string): string; | ||
function define<T extends Bot.BaseConfig, S>(platform: string, bot: Bot.Constructor<T>, adapter: Constructor<T, S>): Plugin.Object<PluginConfig<S, T>>; | ||
function define<T extends Bot.BaseConfig, S, K extends string>(platform: string, bot: Bot.Constructor<T>, adapters: Record<K, Constructor<T, S>>, redirect?: (config: T) => K): Plugin.Object<PluginConfig<S, T>>; | ||
class BotList extends Array<Bot> { | ||
private app; | ||
adapters: Dict<Adapter>; | ||
constructor(app: Context); | ||
protected get caller(): Context; | ||
get(sid: string): Bot<Bot.BaseConfig>; | ||
create<T extends Bot>(platform: string, options: any, constructor?: new (adapter: Adapter, config: any) => T): T; | ||
remove(id: string): boolean; | ||
private resolve; | ||
} | ||
} | ||
export interface Events { | ||
'adapter'(name: string): void; | ||
'bot-added'(bot: Bot): void; | ||
'bot-removed'(bot: Bot): void; | ||
'bot-status-updated'(bot: Bot): void; | ||
'bot-connect'(bot: Bot): Awaitable<void>; | ||
'bot-disconnect'(bot: Bot): Awaitable<void>; | ||
} | ||
export interface Bot extends Bot.BaseConfig, Bot.Methods, Bot.UserBase { | ||
} | ||
export abstract class Bot<T extends Bot.BaseConfig = Bot.BaseConfig> { | ||
adapter: Adapter; | ||
config: T; | ||
app: App; | ||
ctx: Context; | ||
platform: string; | ||
hidden?: boolean; | ||
internal?: any; | ||
selfId?: string; | ||
logger: Logger; | ||
id: string; | ||
private _status; | ||
error?: Error; | ||
constructor(adapter: Adapter, config: T); | ||
private extendModel; | ||
get status(): Bot.Status; | ||
set status(value: Bot.Status); | ||
resolve(): void; | ||
reject(error: Error): void; | ||
start(): Promise<void>; | ||
stop(): Promise<void>; | ||
get sid(): string; | ||
/** @deprecated using `bot.session()` instead */ | ||
createSession(session: Partial<Session>): Session<never, never>; | ||
session(data: Partial<Session>): Promise<Session<never, never>>; | ||
getGuildMemberMap(guildId: string): Promise<{ | ||
[k: string]: string; | ||
}>; | ||
broadcast(channels: (string | [string, string])[], content: string, delay?: number): Promise<string[]>; | ||
} | ||
export namespace Bot { | ||
const library: Dict<Bot.Constructor>; | ||
interface BaseConfig { | ||
disabled?: boolean; | ||
protocol?: string; | ||
platform?: string; | ||
} | ||
interface Constructor<S extends Bot.BaseConfig = Bot.BaseConfig> { | ||
new (adapter: Adapter, config: S): Bot<S>; | ||
schema?: Schema; | ||
} | ||
type Status = 'offline' | 'online' | 'connect' | 'disconnect' | 'reconnect'; | ||
interface Methods { | ||
sendMessage(channelId: string, content: string, guildId?: string): Promise<string[]>; | ||
sendPrivateMessage(userId: string, content: string): Promise<string[]>; | ||
getMessage(channelId: string, messageId: string): Promise<Message>; | ||
editMessage(channelId: string, messageId: string, content: string): Promise<void>; | ||
deleteMessage(channelId: string, messageId: string): Promise<void>; | ||
getSelf(): Promise<User>; | ||
getUser(userId: string): Promise<User>; | ||
getFriendList(): Promise<User[]>; | ||
deleteFriend(userId: string): Promise<void>; | ||
getGuild(guildId: string): Promise<Guild>; | ||
getGuildList(): Promise<Guild[]>; | ||
getGuildMember(guildId: string, userId: string): Promise<GuildMember>; | ||
getGuildMemberList(guildId: string): Promise<GuildMember[]>; | ||
kickGuildMember(guildId: string, userId: string, permanent?: boolean): Promise<void>; | ||
muteGuildMember(guildId: string, userId: string, duration: number, reason?: string): Promise<void>; | ||
getChannel(channelId: string, guildId?: string): Promise<Channel>; | ||
getChannelList(guildId: string): Promise<Channel[]>; | ||
muteChannel(channelId: string, guildId?: string, enable?: boolean): Promise<void>; | ||
handleFriendRequest(messageId: string, approve: boolean, comment?: string): Promise<void>; | ||
handleGuildRequest(messageId: string, approve: boolean, comment?: string): Promise<void>; | ||
handleGuildMemberRequest(messageId: string, approve: boolean, comment?: string): Promise<void>; | ||
getChannelMessageHistory(channelId: string, before?: string): Promise<Message[]>; | ||
} | ||
interface Channel { | ||
channelId: string; | ||
channelName?: string; | ||
} | ||
interface Guild { | ||
guildId: string; | ||
guildName?: string; | ||
} | ||
interface UserBase { | ||
username?: string; | ||
nickname?: string; | ||
avatar?: string; | ||
discriminator?: string; | ||
isBot?: boolean; | ||
} | ||
interface User extends UserBase { | ||
userId: string; | ||
} | ||
interface GuildMember extends User { | ||
roles?: string[]; | ||
} | ||
interface Author extends GuildMember { | ||
anonymous?: string; | ||
} | ||
interface Role { | ||
id: string; | ||
} | ||
interface MessageBase { | ||
messageId?: string; | ||
channelId?: string; | ||
guildId?: string; | ||
userId?: string; | ||
content?: string; | ||
timestamp?: number; | ||
author?: Author; | ||
quote?: Message; | ||
} | ||
interface Message extends MessageBase { | ||
subtype?: 'private' | 'group'; | ||
} | ||
} | ||
type Genres = 'friend' | 'channel' | 'guild' | 'guild-member' | 'guild-role' | 'guild-file' | 'guild-emoji'; | ||
type Actions = 'added' | 'deleted' | 'updated'; | ||
type SessionEventCallback = (session: Session) => void; | ||
export interface Events extends Record<`${Genres}-${Actions}`, SessionEventCallback> { | ||
'message': SessionEventCallback; | ||
'message-deleted': SessionEventCallback; | ||
'message-updated': SessionEventCallback; | ||
'reaction-added': SessionEventCallback; | ||
'reaction-deleted': SessionEventCallback; | ||
'reaction-deleted/one': SessionEventCallback; | ||
'reaction-deleted/all': SessionEventCallback; | ||
'reaction-deleted/emoji': SessionEventCallback; | ||
'send': SessionEventCallback; | ||
'friend-request': SessionEventCallback; | ||
'guild-request': SessionEventCallback; | ||
'guild-member-request': SessionEventCallback; | ||
'guild-member/role': SessionEventCallback; | ||
'guild-member/ban': SessionEventCallback; | ||
'guild-member/nickname': SessionEventCallback; | ||
'notice/poke': SessionEventCallback; | ||
'notice/lucky-king': SessionEventCallback; | ||
'notice/honor': SessionEventCallback; | ||
'notice/honor/talkative': SessionEventCallback; | ||
'notice/honor/performer': SessionEventCallback; | ||
'notice/honor/emotion': SessionEventCallback; | ||
'appellation'(name: string, session: Session): string; | ||
'before-send'(session: Session): Awaitable<void | boolean>; | ||
} | ||
export interface Session extends Session.Payload { | ||
} | ||
export namespace Session { | ||
interface Payload { | ||
platform?: string; | ||
selfId: string; | ||
type?: string; | ||
subtype?: string; | ||
messageId?: string; | ||
channelId?: string; | ||
guildId?: string; | ||
userId?: string; | ||
content?: string; | ||
timestamp?: number; | ||
author?: Bot.Author; | ||
quote?: Bot.Message; | ||
channelName?: string; | ||
guildName?: string; | ||
operatorId?: string; | ||
targetId?: string; | ||
duration?: number; | ||
file?: FileInfo; | ||
} | ||
} | ||
export interface Parsed { | ||
@@ -551,16 +368,7 @@ content: string; | ||
export type Computed<T> = T | ((session: Session) => T); | ||
export class Session<U extends User.Field = never, G extends Channel.Field = never> { | ||
type?: string; | ||
subtype?: string; | ||
subsubtype?: string; | ||
scope?: string; | ||
bot: Bot; | ||
app: App; | ||
selfId: string; | ||
operatorId?: string; | ||
targetId?: string; | ||
duration?: number; | ||
file?: FileInfo; | ||
id: string; | ||
platform?: string; | ||
export namespace Session { | ||
interface Payload extends satori.Session.Payload { | ||
} | ||
} | ||
export class Session<U extends User.Field = never, G extends Channel.Field = never> extends satori.Session<Context> { | ||
argv?: Argv<U, G>; | ||
@@ -571,12 +379,7 @@ user?: User.Observed<U>; | ||
parsed?: Parsed; | ||
scope?: string; | ||
private _promise; | ||
private _queuedTasks; | ||
private _queuedTimeout; | ||
constructor(bot: Bot, session: Partial<Session.Payload>); | ||
[Context.filter](ctx: Context): boolean; | ||
get uid(): string; | ||
get gid(): string; | ||
get cid(): string; | ||
get sid(): string; | ||
toJSON(): Session.Payload; | ||
constructor(bot: satori.Bot<Context>, payload: Partial<Session.Payload>); | ||
private _preprocess; | ||
@@ -609,139 +412,30 @@ preprocess(): Promise<string>; | ||
export type FieldCollector<T extends keyof Tables, K = keyof Tables[T], A extends any[] = any[], O = {}> = Iterable<K> | ((argv: Argv<never, never, A, O>, fields: Set<keyof Tables[T]>) => void); | ||
export interface FileInfo { | ||
id: string; | ||
name: string; | ||
size: number; | ||
busid: number; | ||
export type Plugin = cordis.Plugin<Context>; | ||
export namespace Plugin { | ||
type Function<T = any> = cordis.Plugin.Function<T, Context>; | ||
type Constructor<T = any> = cordis.Plugin.Constructor<T, Context>; | ||
type Object<S = any, T = any> = cordis.Plugin.Object<S, T, Context>; | ||
} | ||
export interface Context extends Internal.Mixin { | ||
$internal: Internal; | ||
export type State = cordis.State<Context>; | ||
export type Fork = cordis.Fork<Context>; | ||
export type Runtime = cordis.Runtime<Context>; | ||
export const Service: { | ||
new (ctx: Context, name: string, immediate?: boolean): cordis.Service<Context>; | ||
}; | ||
export { Disposable } from 'cordis'; | ||
export interface Events<C extends Context = Context> extends satori.Events<C> { | ||
'appellation'(name: string, session: Session): string; | ||
} | ||
export interface Events { | ||
'before-attach-channel'(session: Session, fields: Set<Channel.Field>): void; | ||
'attach-channel'(session: Session): Awaitable<void | boolean>; | ||
'before-attach-user'(session: Session, fields: Set<User.Field>): void; | ||
'attach-user'(session: Session): Awaitable<void | boolean>; | ||
'before-attach'(session: Session): void; | ||
'attach'(session: Session): void; | ||
'middleware'(session: Session): void; | ||
export interface Context { | ||
[Context.events]: Events<this>; | ||
[Context.session]: Session; | ||
options: Context.Config; | ||
} | ||
export type Next = (next?: Next.Callback) => Promise<void | string>; | ||
export type Middleware = (session: Session, next: Next) => Awaitable<void | string>; | ||
export namespace Next { | ||
const MAX_DEPTH = 64; | ||
type Queue = ((next?: Next) => Awaitable<void | string>)[]; | ||
type Callback = void | string | ((next?: Next) => Awaitable<void | string>); | ||
function compose(callback: Callback, next?: Next): Promise<string | void>; | ||
export class Context extends satori.Context { | ||
constructor(options?: Context.Config); | ||
get app(): this; | ||
} | ||
export namespace Internal { | ||
interface Config { | ||
nickname?: string | string[]; | ||
prefix?: Computed<string | string[]>; | ||
} | ||
interface Mixin { | ||
middleware(middleware: Middleware, prepend?: boolean): () => boolean; | ||
} | ||
} | ||
export class Internal { | ||
private ctx; | ||
private config; | ||
_hooks: [Context, Middleware][]; | ||
_nameRE: RegExp; | ||
_sessions: Dict<Session>; | ||
_userCache: SharedCache<User.Observed<any>>; | ||
_channelCache: SharedCache<Channel.Observed<any>>; | ||
constructor(ctx: Context, config: Internal.Config); | ||
protected get caller(): Context; | ||
middleware(middleware: Middleware, prepend?: boolean): () => boolean; | ||
prepare(): void; | ||
private _resolvePrefixes; | ||
private _process; | ||
private _handleMessage; | ||
} | ||
export namespace SharedCache { | ||
interface Entry<T> { | ||
value: T; | ||
key: string; | ||
refs: Set<string>; | ||
} | ||
} | ||
export class SharedCache<T> { | ||
#private; | ||
get(ref: string, key: string): T; | ||
set(ref: string, key: string, value: T): void; | ||
delete(ref: string): void; | ||
} | ||
export interface Context extends SelectorService.Mixin { | ||
selector: SelectorService; | ||
} | ||
export namespace Context { | ||
interface Meta { | ||
filter: Filter; | ||
interface Config extends satori.Context.Config, Config.Basic, Config.Message, Config.Advanced { | ||
} | ||
} | ||
export type Filter = (session: Session) => boolean; | ||
export namespace SelectorService { | ||
interface Mixin { | ||
logger(name: string): Logger; | ||
any(): Context; | ||
never(): Context; | ||
union(arg: Filter | Context): Context; | ||
intersect(arg: Filter | Context): Context; | ||
exclude(arg: Filter | Context): Context; | ||
user(...values: string[]): Context; | ||
self(...values: string[]): Context; | ||
guild(...values: string[]): Context; | ||
channel(...values: string[]): Context; | ||
platform(...values: string[]): Context; | ||
private(...values: string[]): Context; | ||
waterfall<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): Promisify<ReturnType<Events[K]>>; | ||
waterfall<K extends keyof Events>(thisArg: ThisParameterType<Events[K]>, name: K, ...args: Parameters<Events[K]>): Promisify<ReturnType<Events[K]>>; | ||
chain<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): ReturnType<Events[K]>; | ||
chain<K extends keyof Events>(thisArg: ThisParameterType<Events[K]>, name: K, ...args: Parameters<Events[K]>): ReturnType<Events[K]>; | ||
before<K extends BeforeEventName>(name: K, listener: BeforeEventMap[K], append?: boolean): () => boolean; | ||
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): () => boolean; | ||
setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): () => boolean; | ||
} | ||
} | ||
type OmitSubstring<S extends string, T extends string> = S extends `${infer L}${T}${infer R}` ? `${L}${R}` : never; | ||
type BeforeEventName = OmitSubstring<keyof Events & string, 'before-'>; | ||
export type BeforeEventMap = { | ||
[E in keyof Events & string as OmitSubstring<E, 'before-'>]: Events[E]; | ||
}; | ||
export class SelectorService { | ||
private app; | ||
constructor(app: Context); | ||
protected get caller(): Context; | ||
any(): Context; | ||
never(): Context; | ||
union(arg: Filter | Context): Context; | ||
intersect(arg: Filter | Context): Context; | ||
exclude(arg: Filter | Context): Context; | ||
logger(name: string): Logger; | ||
user(...values: string[]): Context; | ||
self(...values: string[]): Context; | ||
guild(...values: string[]): Context; | ||
channel(...values: string[]): Context; | ||
platform(...values: string[]): Context; | ||
private(...values: string[]): Context; | ||
waterfall(...args: [any, ...any[]]): Promise<any>; | ||
chain(...args: [any, ...any[]]): any; | ||
before<K extends BeforeEventName>(name: K, listener: BeforeEventMap[K], append?: boolean): () => boolean; | ||
private createTimerDispose; | ||
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): () => boolean; | ||
setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): () => boolean; | ||
} | ||
export * from '@koishijs/utils'; | ||
export * from 'minato'; | ||
declare const version: string; | ||
export { version }; | ||
/** @deprecated for backward compatibility */ | ||
export interface EventMap { | ||
} | ||
export interface Events extends EventMap { | ||
} | ||
export namespace App { | ||
interface Config extends Config.Basic, Config.Features, Config.Advanced { | ||
} | ||
const Config: Config.Static; | ||
namespace Config { | ||
@@ -755,5 +449,12 @@ interface Basic { | ||
} | ||
interface Features { | ||
interface Message { | ||
delay?: DelayConfig; | ||
} | ||
interface DelayConfig { | ||
character?: number; | ||
message?: number; | ||
cancel?: number; | ||
broadcast?: number; | ||
prompt?: number; | ||
} | ||
interface Advanced { | ||
@@ -765,207 +466,84 @@ maxListeners?: number; | ||
Basic: Schema<Basic>; | ||
Features: Schema<Features>; | ||
Message: Schema<Message>; | ||
Advanced: Schema<Advanced>; | ||
} | ||
} | ||
const Config: Config.Static; | ||
} | ||
export interface DelayConfig { | ||
character?: number; | ||
message?: number; | ||
cancel?: number; | ||
broadcast?: number; | ||
prompt?: number; | ||
export { Context as App }; | ||
export function defineConfig(config: Context.Config): Context.Config; | ||
declare module '@satorijs/core' { | ||
interface Bot { | ||
getGuildMemberMap(guildId: string): Promise<Dict<string>>; | ||
broadcast(channels: (string | [string, string])[], content: string, delay?: number): Promise<string[]>; | ||
} | ||
} | ||
export interface AppConfig extends App.Config.Basic, App.Config.Features, App.Config.Advanced { | ||
export { Adapter, h, Message, segment } from '@satorijs/core'; | ||
export type Filter = satori.Filter<Context>; | ||
export const Bot: (abstract new (ctx: Context, config: satori.Bot.Config) => satori.Bot<Context, satori.Bot.Config>) & { | ||
reusable: boolean; | ||
}; | ||
export type Bot = satori.Bot<Context>; | ||
export namespace Bot { | ||
type Status = satori.Bot.Status; | ||
type Config = satori.Bot.Config; | ||
} | ||
export function defineConfig(config: App.Config): App.Config; | ||
export type Plugin = Plugin.Function | Plugin.Object; | ||
export namespace Plugin { | ||
type Function<T = any> = (ctx: Context, options: T) => void; | ||
type Constructor<T = any> = new (ctx: Context, options: T) => void; | ||
interface Object<S = any, T = any> { | ||
name?: string; | ||
apply: Function<T>; | ||
reusable?: boolean; | ||
Config?: (config?: S) => T; | ||
schema?: (config?: S) => T; | ||
using?: readonly string[]; | ||
} | ||
type Config<T extends Plugin> = T extends Constructor<infer U> ? U : T extends Function<infer U> ? U : T extends Object<infer U> ? U : never; | ||
declare const kTemplate: unique symbol; | ||
export interface Context { | ||
i18n: I18n; | ||
} | ||
export namespace Registry { | ||
interface Config { | ||
export namespace I18n { | ||
type Node = string | Store; | ||
interface Store { | ||
[kTemplate]?: string; | ||
[K: string]: Node; | ||
} | ||
interface Mixin { | ||
using(using: readonly string[], callback: Plugin.Function<void>): Fork; | ||
plugin<T extends Plugin>(plugin: T, config?: boolean | Plugin.Config<T>): Fork; | ||
dispose(plugin?: Plugin): Runtime; | ||
} | ||
type Formatter = (value: any, args: string[], locale: string) => string; | ||
type Renderer = (dict: Dict, params: any, locale: string) => string; | ||
} | ||
export class Registry extends Map<Plugin, Runtime> { | ||
app: Context; | ||
private config; | ||
constructor(app: Context, config: Registry.Config); | ||
private resolve; | ||
get(plugin: Plugin): Runtime; | ||
has(plugin: Plugin): boolean; | ||
set(plugin: Plugin, state: Runtime): this; | ||
delete(plugin: Plugin): boolean; | ||
using(using: readonly string[], callback: Plugin.Function<void>): Fork; | ||
static validate(plugin: any, config: any): any; | ||
plugin(plugin: Plugin, config?: any): Fork; | ||
dispose(plugin: Plugin): Runtime; | ||
export class I18n { | ||
_data: Dict<I18n.Store>; | ||
_formatters: Dict<I18n.Formatter>; | ||
_presets: Dict<I18n.Renderer>; | ||
constructor(ctx: Context); | ||
private set; | ||
define(locale: string, dict: I18n.Store): void; | ||
define(locale: string, key: string, value: I18n.Node): void; | ||
formatter(name: string, callback: I18n.Formatter): void; | ||
preset(name: string, callback: I18n.Renderer): void; | ||
render(value: I18n.Node, params: any, locale: string): string; | ||
text(locales: Iterable<string>, paths: string[], params: object): string; | ||
private registerBuiltins; | ||
} | ||
export type Disposable = () => void; | ||
export abstract class State { | ||
parent: Context; | ||
config: any; | ||
uid: number; | ||
runtime: Runtime; | ||
context: Context; | ||
disposables: Disposable[]; | ||
abstract dispose(): boolean; | ||
abstract restart(): void; | ||
abstract update(config: any): void; | ||
constructor(parent: Context, config: any); | ||
collect(label: string, callback: () => boolean): () => boolean; | ||
protected init(): void; | ||
protected check(): boolean; | ||
clear(preserve?: boolean): void; | ||
export interface Context { | ||
logger(name: string): Logger; | ||
waterfall<K extends keyof GetEvents<this>>(name: K, ...args: Parameters<GetEvents<this>[K]>): Promisify<ReturnType<GetEvents<this>[K]>>; | ||
waterfall<K extends keyof GetEvents<this>>(thisArg: ThisType<GetEvents<this>[K]>, name: K, ...args: Parameters<GetEvents<this>[K]>): Promisify<ReturnType<GetEvents<this>[K]>>; | ||
chain<K extends keyof GetEvents<this>>(name: K, ...args: Parameters<GetEvents<this>[K]>): ReturnType<GetEvents<this>[K]>; | ||
chain<K extends keyof GetEvents<this>>(thisArg: ThisType<GetEvents<this>[K]>, name: K, ...args: Parameters<GetEvents<this>[K]>): ReturnType<GetEvents<this>[K]>; | ||
before<K extends BeforeEventName>(name: K, listener: BeforeEventMap[K], append?: boolean): () => boolean; | ||
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): () => boolean; | ||
setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): () => boolean; | ||
} | ||
export class Fork extends State { | ||
runtime: Runtime; | ||
dispose: () => boolean; | ||
constructor(parent: Context, config: any, runtime: Runtime); | ||
restart(): void; | ||
update(config: any): void; | ||
} | ||
export class Runtime extends State { | ||
private registry; | ||
plugin: Plugin; | ||
runtime: this; | ||
schema: any; | ||
using: readonly string[]; | ||
forkables: Function[]; | ||
children: Fork[]; | ||
isReusable: boolean; | ||
constructor(registry: Registry, plugin: Plugin, config: any); | ||
get isForkable(): boolean; | ||
get name(): string; | ||
fork(parent: Context, config: any): Fork; | ||
dispose(): boolean; | ||
init(): void; | ||
private apply; | ||
restart(): void; | ||
update(config: any): void; | ||
} | ||
export namespace Lifecycle { | ||
interface Config { | ||
maxListeners?: number; | ||
} | ||
interface Mixin { | ||
parallel<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): Promise<void>; | ||
parallel<K extends keyof Events>(thisArg: ThisParameterType<Events[K]>, name: K, ...args: Parameters<Events[K]>): Promise<void>; | ||
emit<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): void; | ||
emit<K extends keyof Events>(thisArg: ThisParameterType<Events[K]>, name: K, ...args: Parameters<Events[K]>): void; | ||
serial<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): Promisify<ReturnType<Events[K]>>; | ||
serial<K extends keyof Events>(thisArg: ThisParameterType<Events[K]>, name: K, ...args: Parameters<Events[K]>): Promisify<ReturnType<Events[K]>>; | ||
bail<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): ReturnType<Events[K]>; | ||
bail<K extends keyof Events>(thisArg: ThisParameterType<Events[K]>, name: K, ...args: Parameters<Events[K]>): ReturnType<Events[K]>; | ||
on<K extends keyof Events>(name: K, listener: Events[K], prepend?: boolean): () => boolean; | ||
once<K extends keyof Events>(name: K, listener: Events[K], prepend?: boolean): () => boolean; | ||
off<K extends keyof Events>(name: K, listener: Events[K]): boolean; | ||
} | ||
} | ||
export class Lifecycle { | ||
#private; | ||
type OmitSubstring<S extends string, T extends string> = S extends `${infer L}${T}${infer R}` ? `${L}${R}` : never; | ||
type BeforeEventName = OmitSubstring<keyof Events & string, 'before-'>; | ||
export type BeforeEventMap = { | ||
[E in keyof Events & string as OmitSubstring<E, 'before-'>]: Events[E]; | ||
}; | ||
export class SelectorService<C extends Context = Context> { | ||
private app; | ||
private config; | ||
isActive: boolean; | ||
_hooks: Record<keyof any, [Context, (...args: any[]) => any][]>; | ||
constructor(app: Context, config: Lifecycle.Config); | ||
queue(value: any): void; | ||
flush(): Promise<void>; | ||
getHooks(name: keyof Events, thisArg?: object): Generator<(...args: any[]) => any, void, unknown>; | ||
parallel(...args: any[]): Promise<void>; | ||
emit(...args: any[]): void; | ||
serial(...args: any[]): Promise<any>; | ||
bail(...args: any[]): any; | ||
register(label: string, hooks: [Context, any][], listener: any, prepend?: boolean): () => boolean; | ||
unregister(hooks: [Context, any][], listener: any): boolean; | ||
on(name: keyof Events, listener: Function, prepend?: boolean): any; | ||
once(name: keyof Events, listener: Function, prepend?: boolean): any; | ||
off<K extends keyof Events>(name: K, listener: Events[K]): boolean; | ||
start(): Promise<void>; | ||
stop(): Promise<void>; | ||
static readonly methods: string[]; | ||
constructor(app: C); | ||
protected get caller(): Context; | ||
logger(name: string): Logger; | ||
waterfall(...args: [any, ...any[]]): Promise<any>; | ||
chain(...args: [any, ...any[]]): any; | ||
before<K extends BeforeEventName>(name: K, listener: BeforeEventMap[K], append?: boolean): () => boolean; | ||
private createTimerDispose; | ||
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): () => boolean; | ||
setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): () => boolean; | ||
} | ||
export interface Events { | ||
'fork': Plugin.Function; | ||
'ready'(): Awaitable<void>; | ||
'dispose'(): Awaitable<void>; | ||
'internal/fork'(fork: Fork): void; | ||
'internal/runtime'(runtime: Runtime): void; | ||
'internal/warning'(format: any, ...param: any[]): void; | ||
'internal/service'(name: string): void; | ||
'internal/update'(fork: Fork, config: any): void; | ||
'internal/hook'(this: Lifecycle, name: string, listener: Function, prepend: boolean): () => boolean; | ||
} | ||
export interface Context extends Context.Services, Context.Meta, Lifecycle.Mixin, Registry.Mixin { | ||
} | ||
declare global { | ||
interface Object { | ||
[Context.current]?: Context; | ||
[Context.source]?: Context; | ||
[Context.filter]?(context: Context): boolean; | ||
} | ||
} | ||
export class Context { | ||
static readonly static: unique symbol; | ||
static readonly filter: unique symbol; | ||
static readonly source: unique symbol; | ||
static readonly current: unique symbol; | ||
static readonly immediate: unique symbol; | ||
extend(meta?: Partial<Context.Meta>): this; | ||
isolate(names: string[]): this; | ||
} | ||
export namespace Context { | ||
/** @deprecated for backward compatibility */ | ||
interface Services { | ||
app: App; | ||
lifecycle: Lifecycle; | ||
registry: Registry; | ||
} | ||
const Services: string[]; | ||
interface MixinOptions { | ||
methods?: string[]; | ||
} | ||
function mixin(name: keyof any, options: MixinOptions): void; | ||
interface ServiceOptions extends MixinOptions { | ||
constructor?: any; | ||
} | ||
interface Meta { | ||
app: App; | ||
state: State; | ||
mapping: Dict<symbol>; | ||
} | ||
const internal: any; | ||
function service(name: keyof any, options?: ServiceOptions): void; | ||
} | ||
export class App extends Context { | ||
options: App.Config; | ||
counter: number; | ||
constructor(config?: App.Config); | ||
start(): Promise<void>; | ||
stop(): Promise<void>; | ||
} | ||
export namespace App { | ||
interface Config extends Lifecycle.Config, Registry.Config { | ||
} | ||
} | ||
export class Service { | ||
protected ctx: Context; | ||
protected start(): Awaitable<void>; | ||
protected stop(): Awaitable<void>; | ||
protected fork?(ctx: Context, config: any): void; | ||
constructor(ctx: Context, name: string, immediate?: boolean); | ||
get caller(): Context; | ||
} | ||
export * from '@koishijs/utils'; | ||
export * from 'minato'; | ||
declare const version: string; | ||
export { version }; |
{ | ||
"name": "@koishijs/core", | ||
"description": "Core Features for Koishi", | ||
"version": "4.7.6", | ||
"version": "4.8.0", | ||
"main": "lib/node.js", | ||
@@ -28,4 +28,2 @@ "module": "lib/browser.js", | ||
"devDependencies": { | ||
"@koishijs/plugin-database-memory": "^1.4.0", | ||
"@koishijs/plugin-mock": "^1.0.6", | ||
"chai": "^4.3.6", | ||
@@ -36,7 +34,8 @@ "chai-as-promised": "^7.1.1", | ||
"dependencies": { | ||
"@koishijs/utils": "^5.4.5", | ||
"cordis": "^1.6.0", | ||
"@koishijs/utils": "^6.0.0", | ||
"@satorijs/core": "^1.0.2", | ||
"cordis": "^2.0.6", | ||
"fastest-levenshtein": "^1.0.12", | ||
"minato": "^1.2.1" | ||
"minato": "^1.2.3" | ||
} | ||
} | ||
} |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
3
7
279774
5
2781
+ Added@satorijs/core@^1.0.2
+ Added@koishijs/utils@6.4.1(transitive)
+ Added@satorijs/core@1.5.2(transitive)
+ Added@satorijs/element@2.6.1(transitive)
+ Addedasynckit@0.4.0(transitive)
+ Addedaxios@1.1.3(transitive)
+ Addedcall-bind-apply-helpers@1.0.2(transitive)
+ Addedcombined-stream@1.0.8(transitive)
+ Addedcordis@2.10.3(transitive)
+ Addedcordis-axios@2.2.1(transitive)
+ Addeddelayed-stream@1.0.0(transitive)
+ Addeddunder-proto@1.0.1(transitive)
+ Addedes-define-property@1.0.1(transitive)
+ Addedes-errors@1.3.0(transitive)
+ Addedes-object-atoms@1.1.1(transitive)
+ Addedes-set-tostringtag@2.1.0(transitive)
+ Addedfollow-redirects@1.15.9(transitive)
+ Addedform-data@4.0.2(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedget-intrinsic@1.3.0(transitive)
+ Addedget-proto@1.0.1(transitive)
+ Addedgopd@1.2.0(transitive)
+ Addedhas-symbols@1.1.0(transitive)
+ Addedhas-tostringtag@1.0.2(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedinaba@1.1.1(transitive)
+ Addedmath-intrinsics@1.1.0(transitive)
+ Addedmime-db@1.52.01.53.0(transitive)
+ Addedmime-types@2.1.35(transitive)
+ Addedproxy-from-env@1.1.0(transitive)
+ Addedws@8.18.1(transitive)
- Removed@koishijs/segment@1.1.1(transitive)
- Removed@koishijs/utils@5.4.5(transitive)
- Removedcordis@1.6.0(transitive)
Updated@koishijs/utils@^6.0.0
Updatedcordis@^2.0.6
Updatedminato@^1.2.3