gramstax 0.0.14 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1 @@
1
1
  "use strict";var z=Object.create;var v=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var H=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var p=(u,i)=>v(u,"name",{value:i,configurable:!0});var q=(u,i)=>{for(var s in i)v(u,s,{get:i[s],enumerable:!0})},K=(u,i,s,e)=>{if(i&&typeof i=="object"||typeof i=="function")for(let t of U(i))!J.call(u,t)&&t!==s&&v(u,t,{get:()=>i[t],enumerable:!(e=G(i,t))||e.enumerable});return u};var X=(u,i,s)=>(s=u!=null?z(H(u)):{},K(i||!u||!u.__esModule?v(s,"default",{value:u,enumerable:!0}):s,u)),Y=u=>K(v({},"__esModule",{value:!0}),u);var Z={};q(Z,{BaseGeneral:()=>F,CacheExternal:()=>k,Ctx:()=>x,Gramstax:()=>D,TemplateEngine:()=>f,TemplateManager:()=>T});module.exports=Y(Z);var $=require("logging-pretty");var F=class{static{p(this,"BaseGeneral")}static log=new $.LoggingPretty;static logError(i,s){this.log.error(`[${this.toString().match(/class\s+([^\s{]+)/)?.[1]}:${s}]: ${String(i)}`)}logError(i,s,e){this.constructor.log.error(`[${s||this.constructor.name}:${e}] ${String(i)}`)}};var L=require("keyv"),R=X(require("@keyv/redis"),1);var k=class extends L.Keyv{constructor(s="memory",e,t,o){let n;s.startsWith("redis")&&(n=new R.default(s)),s==="memory"&&(n=new Map),o?.forceStore&&(n=o.forceStore);super({store:n,namespace:e,ttl:t});this.url=s}static{p(this,"CacheExternal")}};var B=require("timers/promises");var P=require("grammy");var x=class extends F{static{p(this,"Ctx")}static template;static data;data=this.constructor.data;get isPremium(){return this.ct.from?.is_premium??!1}get isBot(){return this.ct.from?.is_bot??!1}get userid(){return this.ct.from?.id}get username(){return this.ct.from?.username}get fullname(){return`${this.ct.from?.first_name||""}${this.ct.from?.last_name||""}`}get firstname(){return this.ct.from?.first_name}get lastname(){return this.ct.from?.last_name}get msgText(){return this.ct.message?.text}get msgTextIntent(){return this.msgText&&this.msgText.indexOf(" ")!=-1?this.msgText.split(" ")[0]:""}get msgTextPayloads(){return this.msgText&&this.msgText.indexOf(" ")!=-1?this.msgText.split(" ").slice(1):[]}get msgTextPayload(){return this.msgTextPayloads[0]}get msgCaption(){return this.ct.message?.caption}get msgCaptionIntent(){return this.msgCaption&&this.msgCaption.indexOf(" ")!=-1?this.msgCaption.split(" ")[0]:""}get msgPhoto(){return this.ct.message?.photo}get msgVideo(){return this.ct.message?.video}get msgAudio(){return this.ct.message?.audio}get callbackData(){return this.ct.callbackQuery?.data}get callbackDataIntent(){return this.callbackData&&this.callbackData.indexOf(":")!=-1?this.callbackData.split(":")[0]:""}get callbackDataPayloads(){return this.callbackData&&this.callbackData.indexOf(":")!=-1?this.callbackData.split(":").slice(1):[]}get callbackDataPayload(){return this.callbackDataPayloads?.[0]}get callbackDataParts(){return this.callbackDataPayload&&this.callbackDataPayload.indexOf("+")!=-1?this.callbackDataPayload.split("+"):[]}get languageCode(){return this.ct.from?.language_code}set languageCode(i){this.ct.from.language_code=i}set session(i){this.temp.session=i}get session(){return this.temp.session}ct;cacheSession;cacheKeyboard;templateManager;temp;constructor(i){super(),this.ct=i.ct,this.cacheSession=i.cacheSession,this.cacheKeyboard=i.cacheKeyboard,this.templateManager=i.templateManager,this.temp=i.temp,i?.data&&(this.temp.data=i.data)}async broadcast(i,s,e,t,o,n){let r=s.map(d=>this.templateManager.getMessage(this.data.name,o,d,t));for(let d=0;d<i.length;d++){let l=i[d],c=r[d];await this.ct.api.sendMessage(l,c,{parse_mode:"HTML",reply_markup:e,...n}),d+1==30&&await(0,B.setTimeout)(1200)}}async reply(i,s,e,t){let o=this.templateManager.getMessage(this.data.name,e,this.languageCode,s);return await this.ct.reply(o,{parse_mode:"HTML",reply_markup:i,...t})}async replyAction(i){return await this.ct.replyWithChatAction(i)}async edit(i,s,e,t){try{let o=this.templateManager.getMessage(this.data.name,e,this.languageCode,s);return await this.ct.editMessageText(o,{parse_mode:"HTML",reply_markup:i,...t})}catch{await this.reply(i,s,e,t)}}async delete(){return await this.ct.deleteMessage()}async callbackQueryAnswer(i){try{return await this.ct.answerCallbackQuery(i)}catch{return null}}async sessionSet(i,s,...e){try{let t={method:i,params:s,...e},o=await this.cacheSession.set(`${this.userid}`,{method:i,params:s,...e});return o&&(this.session=t),o}catch{return null}}async sessionGet(){try{let i=await this.cacheSession.get(`${this.userid}`);return i&&(this.session=i),i||null}catch{return null}}async sessionClear(){try{let i=await this.cacheSession.delete(`${this.userid}`);return i&&(this.session={}),i}catch{return null}}static buildData(i){return{name:"",callbackData:i?function(...s){let e=i(...s);return`${this.name}${e===void 0?"":`:${e}`}`}:function(){return this?.name}}}buildInlineKeyboard(i,s){let e=this.data.name;if(s?.cache===!0){let a=`${e}:${this.languageCode}:inline`,r=this.cacheKeyboard.get(a);if(!r){let d=new P.InlineKeyboard,l=this.templateManager.getKeyboard(e,s?.baseId,this.languageCode,"inline",s?.data),c=i(d,l);return this.cacheKeyboard.set(a,c),c}return r}let t=new P.InlineKeyboard,o=this.templateManager.getKeyboard(e,s?.baseId,this.languageCode,"inline",s?.data);return i(t,o)}buildKeyboard(i,s){let e=this.data.name;if(s?.cache===!0){let a=`${e}:${this.languageCode}:default`,r=this.cacheKeyboard.get(a);if(!r){let d=new P.Keyboard,l=this.templateManager.getKeyboard(e,s?.baseId,this.languageCode,"default",s?.data),c=i(d,l);return c.resized(!0),this.cacheKeyboard.set(a,c),c}return r}let t=new P.Keyboard,o=this.templateManager.getKeyboard(e,s?.baseId,this.languageCode,"default",s?.data),n=i(t,o);return n.resized(),n}validateSessionCallback(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodCallback(s)}validateSessionCallbackPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodCallbackPayload(s)}validateSessionText(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodText(s)}validateSessionTextPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodTextPayload(s)}validateSessionTextCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodTextCommand(s)}validateSessionTextCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodTextCommandPayload(s)}validateSessionTextFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodTextFree(s)}validateSessionPhotoCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodPhotoCaption(s)}validateSessionPhotoCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodPhotoCaptionPayload(s)}validateSessionPhotoCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodPhotoCaptionCommand(s)}validateSessionPhotoCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodPhotoCaptionCommandPayload(s)}validateSessionPhotoFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodPhotoFree(s)}validateSessionVideoCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoCaption(s)}validateSessionVideoCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoCaptionPayload(s)}validateSessionVideoCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoCaptionCommand(s)}validateSessionVideoCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoCaptionCommandPayload(s)}validateSessionVideoFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoFree(s)}validateSessionAudioCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAudioCaption(s)}validateSessionAudioCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAudioCaptionPayload(s)}validateSessionAudioCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAudioCaptionCommand(s)}validateSessionAudioCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAudioCaptionCommandPayload(s)}validateSessionAudioFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAudioFree(s)}validateSessionDocumentCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodDocumentCaption(s)}validateSessionDocumentCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodDocumentCaptionPayload(s)}validateSessionDocumentCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodDocumentCaptionCommand(s)}validateSessionDocumentCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodDocumentCaptionCommandPayload(s)}validateSessionDocumentFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodDocumentFree(s)}validateSessionAnimationCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAnimationCaption(s)}validateSessionAnimationCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAnimationCaptionPayload(s)}validateSessionAnimationCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAnimationCaptionCommand(s)}validateSessionAnimationCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAnimationCaptionCommandPayload(s)}validateSessionAnimationFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAnimationFree(s)}validateSessionVoiceCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVoiceCaption(s)}validateSessionVoiceCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVoiceCaptionPayload(s)}validateSessionVoiceCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVoiceCaptionCommand(s)}validateSessionVoiceCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVoiceCaptionCommandPayload(s)}validateSessionVoiceFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVoiceFree(s)}validateSessionVideoNoteCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoNoteCaption(s)}validateSessionVideoNoteCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoNoteCaptionPayload(s)}validateSessionVideoNoteCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoNoteCaptionCommand(s)}validateSessionVideoNoteCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoNoteCaptionCommandPayload(s)}validateSessionVideoNoteFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoNoteFree(s)}validateSessionStickerFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodStickerFree(s)}validateSessionLocationFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodLocationFree(s)}validateSessionContactFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodContactFree(s)}sessionCallback(i,s){return this.sessionSet(this.buildSessionMethodCallback(s),i)}sessionCallbackPayload(i,s){return this.sessionSet(this.buildSessionMethodCallbackPayload(s),i)}sessionText(i,s){return this.sessionSet(this.buildSessionMethodText(s),i)}sessionTextPayload(i,s){return this.sessionSet(this.buildSessionMethodTextPayload(s),i)}sessionTextCommand(i,s){return this.sessionSet(this.buildSessionMethodTextCommand(s),i)}sessionTextCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodTextCommandPayload(s),i)}sessionTextFree(i,s){return this.sessionSet(this.buildSessionMethodTextFree(s),i)}sessionPhotoCaption(i,s){return this.sessionSet(this.buildSessionMethodPhotoCaption(s),i)}sessionPhotoCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodPhotoCaptionPayload(s),i)}sessionPhotoCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodPhotoCaptionCommand(s),i)}sessionPhotoCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodPhotoCaptionCommandPayload(s),i)}sessionPhotoFree(i,s){return this.sessionSet(this.buildSessionMethodPhotoFree(s),i)}sessionVideoCaption(i,s){return this.sessionSet(this.buildSessionMethodVideoCaption(s),i)}sessionVideoCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodVideoCaptionPayload(s),i)}sessionVideoCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodVideoCaptionCommand(s),i)}sessionVideoCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodVideoCaptionCommandPayload(s),i)}sessionVideoFree(i,s){return this.sessionSet(this.buildSessionMethodVideoFree(s),i)}sessionAudioCaption(i,s){return this.sessionSet(this.buildSessionMethodAudioCaption(s),i)}sessionAudioCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodAudioCaptionPayload(s),i)}sessionAudioCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodAudioCaptionCommand(s),i)}sessionAudioCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodAudioCaptionCommandPayload(s),i)}sessionAudioFree(i,s){return this.sessionSet(this.buildSessionMethodAudioFree(s),i)}sessionDocumentCaption(i,s){return this.sessionSet(this.buildSessionMethodDocumentCaption(s),i)}sessionDocumentCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodDocumentCaptionPayload(s),i)}sessionDocumentCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodDocumentCaptionCommand(s),i)}sessionDocumentCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodDocumentCaptionCommandPayload(s),i)}sessionDocumentFree(i,s){return this.sessionSet(this.buildSessionMethodDocumentFree(s),i)}sessionAnimationCaption(i,s){return this.sessionSet(this.buildSessionMethodAnimationCaption(s),i)}sessionAnimationCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodAnimationCaptionPayload(s),i)}sessionAnimationCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodAnimationCaptionCommand(s),i)}sessionAnimationCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodAnimationCaptionCommandPayload(s),i)}sessionAnimationFree(i,s){return this.sessionSet(this.buildSessionMethodAnimationFree(s),i)}sessionVoiceCaption(i,s){return this.sessionSet(this.buildSessionMethodVoiceCaption(s),i)}sessionVoiceCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodVoiceCaptionPayload(s),i)}sessionVoiceCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodVoiceCaptionCommand(s),i)}sessionVoiceCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodVoiceCaptionCommandPayload(s),i)}sessionVoiceFree(i,s){return this.sessionSet(this.buildSessionMethodVoiceFree(s),i)}sessionVideoNoteCaption(i,s){return this.sessionSet(this.buildSessionMethodVideoNoteCaption(s),i)}sessionVideoNoteCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodVideoNoteCaptionPayload(s),i)}sessionVideoNoteCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodVideoNoteCaptionCommand(s),i)}sessionVideoNoteCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodVideoNoteCaptionCommandPayload(s),i)}sessionVideoNoteFree(i,s){return this.sessionSet(this.buildSessionMethodVideoNoteFree(s),i)}sessionStickerFree(i,s){return this.sessionSet(this.buildSessionMethodStickerFree(s),i)}sessionLocationFree(i,s){return this.sessionSet(this.buildSessionMethodLocationFree(s),i)}sessionContactFree(i,s){return this.sessionSet(this.buildSessionMethodContactFree(s),i)}sessionToCallback(i,s){return this.sessionCallback({...this.session.params,...i},s)}sessionToCallbackPayload(i,s){return this.sessionCallbackPayload({...this.session.params,...i},s)}sessionToText(i,s){return this.sessionText({...this.session.params,...i},s)}sessionToTextPayload(i,s){return this.sessionTextPayload({...this.session.params,...i},s)}sessionToTextCommand(i,s){return this.sessionTextCommand({...this.session.params,...i},s)}sessionToTextCommandPayload(i,s){return this.sessionTextCommandPayload({...this.session.params,...i},s)}sessionToTextFree(i,s){return this.sessionTextFree({...this.session.params,...i},s)}sessionToPhotoCaption(i,s){return this.sessionPhotoCaption({...this.session.params,...i},s)}sessionToPhotoCaptionPayload(i,s){return this.sessionPhotoCaptionPayload({...this.session.params,...i},s)}sessionToPhotoCaptionCommand(i,s){return this.sessionPhotoCaptionCommand({...this.session.params,...i},s)}sessionToPhotoCaptionCommandPayload(i,s){return this.sessionPhotoCaptionCommandPayload({...this.session.params,...i},s)}sessionToPhotoFree(i,s){return this.sessionPhotoFree({...this.session.params,...i},s)}sessionToVideoCaption(i,s){return this.sessionVideoCaption({...this.session.params,...i},s)}sessionToVideoCaptionPayload(i,s){return this.sessionVideoCaptionPayload({...this.session.params,...i},s)}sessionToVideoCaptionCommand(i,s){return this.sessionVideoCaptionCommand({...this.session.params,...i},s)}sessionToVideoCaptionCommandPayload(i,s){return this.sessionVideoCaptionCommandPayload({...this.session.params,...i},s)}sessionToVideoFree(i,s){return this.sessionVideoFree({...this.session.params,...i},s)}sessionToAudioCaption(i,s){return this.sessionAudioCaption({...this.session.params,...i},s)}sessionToAudioCaptionPayload(i,s){return this.sessionAudioCaptionPayload({...this.session.params,...i},s)}sessionToAudioCaptionCommand(i,s){return this.sessionAudioCaptionCommand({...this.session.params,...i},s)}sessionToAudioCaptionCommandPayload(i,s){return this.sessionAudioCaptionCommandPayload({...this.session.params,...i},s)}sessionToAudioFree(i,s){return this.sessionAudioFree({...this.session.params,...i},s)}sessionToDocumentCaption(i,s){return this.sessionDocumentCaption({...this.session.params,...i},s)}sessionToDocumentCaptionPayload(i,s){return this.sessionDocumentCaptionPayload({...this.session.params,...i},s)}sessionToDocumentCaptionCommand(i,s){return this.sessionDocumentCaptionCommand({...this.session.params,...i},s)}sessionToDocumentCaptionCommandPayload(i,s){return this.sessionDocumentCaptionCommandPayload({...this.session.params,...i},s)}sessionToDocumentFree(i,s){return this.sessionDocumentFree({...this.session.params,...i},s)}sessionToAnimationCaption(i,s){return this.sessionAnimationCaption({...this.session.params,...i},s)}sessionToAnimationCaptionPayload(i,s){return this.sessionAnimationCaptionPayload({...this.session.params,...i},s)}sessionToAnimationCaptionCommand(i,s){return this.sessionAnimationCaptionCommand({...this.session.params,...i},s)}sessionToAnimationCaptionCommandPayload(i,s){return this.sessionAnimationCaptionCommandPayload({...this.session.params,...i},s)}sessionToAnimationFree(i,s){return this.sessionAnimationFree({...this.session.params,...i},s)}sessionToVoiceCaption(i,s){return this.sessionVoiceCaption({...this.session.params,...i},s)}sessionToVoiceCaptionPayload(i,s){return this.sessionVoiceCaptionPayload({...this.session.params,...i},s)}sessionToVoiceCaptionCommand(i,s){return this.sessionVoiceCaptionCommand({...this.session.params,...i},s)}sessionToVoiceCaptionCommandPayload(i,s){return this.sessionVoiceCaptionCommandPayload({...this.session.params,...i},s)}sessionToVoiceFree(i,s){return this.sessionVoiceFree({...this.session.params,...i},s)}sessionToVideoNoteCaption(i,s){return this.sessionVideoNoteCaption({...this.session.params,...i},s)}sessionToVideoNoteCaptionPayload(i,s){return this.sessionVideoNoteCaptionPayload({...this.session.params,...i},s)}sessionToVideoNoteCaptionCommand(i,s){return this.sessionVideoNoteCaptionCommand({...this.session.params,...i},s)}sessionToVideoNoteCaptionCommandPayload(i,s){return this.sessionVideoNoteCaptionCommandPayload({...this.session.params,...i},s)}sessionToVideoNoteFree(i,s){return this.sessionVideoNoteFree({...this.session.params,...i},s)}sessionToStickerFree(i,s){return this.sessionStickerFree({...this.session.params,...i},s)}sessionToLocationFree(i,s){return this.sessionLocationFree({...this.session.params,...i},s)}sessionToContactFree(i,s){return this.sessionContactFree({...this.session.params,...i},s)}buildIntent(i,s=!0){i||(i=s?this.data.callbackData():this.data.name);let e=s?":":" ";return i?.indexOf?.(e)!=-1?i?.split?.(e)?.[0]:i}buildSessionMethod(i,s){return`${i}-${s||this.data.name}`}buildSessionMethodCallback(i){return this.buildSessionMethod("1",i)}buildSessionMethodCallbackPayload(i){return this.buildSessionMethod("2",i)}buildSessionMethodText(i){return this.buildSessionMethod("3",i)}buildSessionMethodTextPayload(i){return this.buildSessionMethod("4",i)}buildSessionMethodTextCommand(i){return this.buildSessionMethod("5",i)}buildSessionMethodTextCommandPayload(i){return this.buildSessionMethod("6",i)}buildSessionMethodTextFree(i){return this.buildSessionMethod("7",i)}buildSessionMethodPhotoCaption(i){return this.buildSessionMethod("8",i)}buildSessionMethodPhotoCaptionPayload(i){return this.buildSessionMethod("9",i)}buildSessionMethodPhotoCaptionCommand(i){return this.buildSessionMethod("10",i)}buildSessionMethodPhotoCaptionCommandPayload(i){return this.buildSessionMethod("11",i)}buildSessionMethodPhotoFree(i){return this.buildSessionMethod("12",i)}buildSessionMethodVideoCaption(i){return this.buildSessionMethod("13",i)}buildSessionMethodVideoCaptionPayload(i){return this.buildSessionMethod("14",i)}buildSessionMethodVideoCaptionCommand(i){return this.buildSessionMethod("15",i)}buildSessionMethodVideoCaptionCommandPayload(i){return this.buildSessionMethod("16",i)}buildSessionMethodVideoFree(i){return this.buildSessionMethod("17",i)}buildSessionMethodAudioCaption(i){return this.buildSessionMethod("18",i)}buildSessionMethodAudioCaptionPayload(i){return this.buildSessionMethod("19",i)}buildSessionMethodAudioCaptionCommand(i){return this.buildSessionMethod("20",i)}buildSessionMethodAudioCaptionCommandPayload(i){return this.buildSessionMethod("21",i)}buildSessionMethodAudioFree(i){return this.buildSessionMethod("22",i)}buildSessionMethodDocumentCaption(i){return this.buildSessionMethod("23",i)}buildSessionMethodDocumentCaptionPayload(i){return this.buildSessionMethod("24",i)}buildSessionMethodDocumentCaptionCommand(i){return this.buildSessionMethod("25",i)}buildSessionMethodDocumentCaptionCommandPayload(i){return this.buildSessionMethod("26",i)}buildSessionMethodDocumentFree(i){return this.buildSessionMethod("27",i)}buildSessionMethodAnimationCaption(i){return this.buildSessionMethod("28",i)}buildSessionMethodAnimationCaptionPayload(i){return this.buildSessionMethod("29",i)}buildSessionMethodAnimationCaptionCommand(i){return this.buildSessionMethod("30",i)}buildSessionMethodAnimationCaptionCommandPayload(i){return this.buildSessionMethod("31",i)}buildSessionMethodAnimationFree(i){return this.buildSessionMethod("32",i)}buildSessionMethodVoiceCaption(i){return this.buildSessionMethod("33",i)}buildSessionMethodVoiceCaptionPayload(i){return this.buildSessionMethod("34",i)}buildSessionMethodVoiceCaptionCommand(i){return this.buildSessionMethod("35",i)}buildSessionMethodVoiceCaptionCommandPayload(i){return this.buildSessionMethod("36",i)}buildSessionMethodVoiceFree(i){return this.buildSessionMethod("37",i)}buildSessionMethodVideoNoteCaption(i){return this.buildSessionMethod("38",i)}buildSessionMethodVideoNoteCaptionPayload(i){return this.buildSessionMethod("39",i)}buildSessionMethodVideoNoteCaptionCommand(i){return this.buildSessionMethod("40",i)}buildSessionMethodVideoNoteCaptionCommandPayload(i){return this.buildSessionMethod("41",i)}buildSessionMethodVideoNoteFree(i){return this.buildSessionMethod("42",i)}buildSessionMethodStickerFree(i){return this.buildSessionMethod("43",i)}buildSessionMethodLocationFree(i){return this.buildSessionMethod("44",i)}buildSessionMethodContactFree(i){return this.buildSessionMethod("45",i)}};var O=require("bun"),M=require("path");var W=require("logging-pretty");var f=class{static{p(this,"TemplateEngine")}static _escape(i){return i.replace(/\\/g,"\\\\").replace(/`/g,"\\`")}static _processVariables(i){return i.replace(/\{\{(\w+)\}\}/g,(s,e)=>`\${(data && data["${e}"]) ?? ""}`)}static _processBaseBlocks(i){let s=/<base\b[^>]*?(?:\sid=(["']?)([^"'\s>]+)\1)?[^>]*?>([\s\S]*?)<\/base>/g,e={};for(let t of i.matchAll(s)){let o=t[2]??"default",a=(t[3]??"").replace(/^[\t ]+/gm,"").replace(/^\n+/,"").replace(/\n+$/,"").trim();e[o]=a}return e}static _processScriptBlocks(i){return i.replace(/<script\b[^>]*>([\s\S]*?)<\/script>/gi,(s,e)=>{let t=e.trim();return t?`\${(() => { if (!data) return ''; try { with(data) { ${t} } } catch(e) { return '' } })()}`:""})}static _processSpaceBlocks(i){return i.replace(/^[ \t]*<space\s*\/>[ \t]*$/gim,"")}static _processDivBlocks(i){return i.replace(/<div>([\s\S]*?)<\/div>/gi,(s,e)=>e.replace(/^[\t ]+/gm,"").replace(/^\n+/,"").replace(/\n+$/,""))}static _processMessageBlocks(i){let s=/<message\s+lang="([^"]+)"\s*>([\s\S]*?)<\/message>/gi,e={};for(let[,t,o]of i.matchAll(s)){let n=o.replace(/^[\t ]+/gm,"").replace(/^\n+/,"").replace(/\n+$/,"").trim();e[t]=n}return e}static _processKeyboardBlocks(i){let s=/<keyboard\b[^>]*\blang="([^"]*)"[^>]*?(?:\sfor="([^"]*)")?[^>]*>([\s\S]*?)<\/keyboard>/gi,e={};for(let[,t,o,n]of i.matchAll(s)){let a=o==="default"?"default":"inline",r=n.trim();e[t]||(e[t]={}),e[t][a]=r}return e}static _compileToFunction(i,s){let e;s?e=i.map(n=>`\`${n}\``).join(","):e=`\`${i}\``;let t=e;if(t=this._processScriptBlocks(this._processDivBlocks(this._processSpaceBlocks(t))),s){let o=`return [${t}]`;return new Function("data",o)}else{let o=`return ${t}`;return new Function("data",o)}}static compileMessages(i){let s=this._processBaseBlocks(i),e={};for(let[t,o]of Object.entries(s)){let n=this._processMessageBlocks(o);e[t]={};for(let[a,r]of Object.entries(n)){let d=this._processVariables(this._processScriptBlocks(r));e[t][a]=this._compileToFunction(d,!1)}}return e}static compileKeyboards(i){let s=this._processBaseBlocks(i),e={};for(let[t,o]of Object.entries(s)){let n=this._processKeyboardBlocks(o);e[t]={};for(let[a,r]of Object.entries(n)){e[t][a]={};for(let[d,l]of Object.entries(r)){let C=l.split(/(?<!\\),\s*/).map(m=>m.replace(/\\,/g,",").trim()).map(m=>this._processVariables(this._processScriptBlocks(m)));e[t][a][d]=this._compileToFunction(C,!0)}}}return e}};var V=require("fs/promises"),E=require("chokidar"),y=require("path"),g=require("fs");var T=class{static{p(this,"TemplateManager")}_map=new Map;_engine=f;_watcher=null;_supportedExtensions=new Set([".html"]);_path;_forceLanguage;_isWatchEnabled;constructor(i={}){let{enableWatch:s=!1,path:e=null,forceLanguage:t=null}=i;this._path=e,this._forceLanguage=t,this._isWatchEnabled=s,this._validatePath(),this._initializeWatcher(),this._loadAllFiles()}_validatePath(){try{if(this._path===null||!(0,g.existsSync)(this._path))return;if(!(0,g.statSync)(this._path).isDirectory())throw new Error(`Template path is not a directory: ${this._path}`)}catch(i){throw new Error(`Failed to validate Template path: ${i}`)}}_initializeWatcher(){this._path===null||!this._isWatchEnabled||(this._watcher=(0,E.watch)(this._path,{persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50}}),this._watcher.on("change",this._handleFileChange.bind(this)),this._watcher.on("add",this._handleFileAdd.bind(this)),this._watcher.on("unlink",this._handleFileDelete.bind(this)),this._watcher.on("error",this._handleWatchError.bind(this)))}async _handleFileChange(i){let s=(0,y.basename)(i);this._isValidFile(s)&&await this._loadFile(s,!1)}async _handleFileAdd(i){let s=(0,y.basename)(i);this._isValidFile(s)&&await this._loadFile(s,!1)}_handleFileDelete(i){let s=(0,y.basename)(i),e=this._getKey(s);this._map.has(e)&&this._map.delete(e)}_handleWatchError(i){}_loadAllFiles(){if(this._path===null||!(0,g.existsSync)(this._path))return;let s=(0,g.readdirSync)(this._path,{encoding:"utf8"}).filter(e=>this._isValidFile(e));for(let e of s)this._loadFile(e,!0)}async _loadFile(i,s=!0){if(this._path===null)return;let e=(0,y.join)(this._path,i),t=this._getKey(i),o=s?(0,g.readFileSync)(e,{encoding:"utf8"}):await(0,V.readFile)(e,{encoding:"utf8"});this.compile(t,o)}_isValidFile(i){let s=(0,y.extname)(i).toLowerCase();return this._supportedExtensions.has(s)}_getKey(i){return i.replace(/\.[^/.]+$/,"")}compile(i,s,e){let t=this._map.get(i),o=t||{},n=!1;(e===void 0||e?.message===!1||t?.message===void 0)&&(o.message=f.compileMessages(s),n=!0),(e===void 0||e?.keyboard===!1||t?.keyboard===void 0)&&(o.keyboard=f.compileKeyboards(s),n=!0),n&&this._map.set(i,o)}getMessage(i,s="default",e="en",t){let n=this._map.get(i)?.message?.[s]?.[this._forceLanguage||e];if(!n)return"";try{return n(t)}catch{return""}}getKeyboard(i,s="default",e="en",t="inline",o){let a=this._map.get(i)?.keyboard?.[s]?.[this._forceLanguage||e]?.[t];if(!a)return[];try{return a(o)}catch{return[]}}setMessage(i,s){this.compile(i,s,{keyboard:!0})}setKeyboard(i,s){this.compile(i,s,{message:!0})}async write(i,s){if(this._path===null)return;let e=(0,y.join)(this._path,i);await(0,V.mkdir)(this._path,{recursive:!0}),(0,g.writeFileSync)(e,s,{encoding:"utf8"}),await this._loadFile(i,!1)}getAvailable(){return Array.from(this._map.keys())}has(i){return this._map.has(i)}getCacheStats(){return{templateCount:this._map.size,totalSize:JSON.stringify(this._map.entries().toArray(),(i,s)=>typeof s=="function"?s.toString():s).length}}async destroy(){this._watcher&&await this._watcher.close(),this._map.clear()}};var _=require("fs"),w=require("grammy");var D=class{static{p(this,"Gramstax")}templateManager;cacheKeyboard;cacheSession;pages;log;bot;constructor(i){this.log=i.log===null?void 0:i.log===void 0?new W.LoggingPretty:i.log,this.cacheSession=i.cacheSession||new k("memory","session"),this.cacheKeyboard=i.cacheKeyboard||new Map,this.templateManager=i.templateManager||new T({path:null}),this.bot=new w.Bot(i.token),this.bot.catch(this.onCatch),this.bot.on("callback_query:data",this.onCallbackQueryData.bind(this)),this.bot.on("message:text",this.onMessageText.bind(this)),this.bot.on("message:photo",this.onMessagePhoto.bind(this)),this.bot.on("message:video",this.onMessageVideo.bind(this)),this.bot.on("message:audio",this.onMessageAudio.bind(this)),this.bot.on("message:document",this.onMessageDocument.bind(this)),this.bot.on("message:animation",this.onMessageAnimation.bind(this)),this.bot.on("message:voice",this.onMessageVoice.bind(this)),this.bot.on("message:video_note",this.onMessageVideoNote.bind(this)),this.bot.on("message:sticker",this.onMessageSticker.bind(this)),this.bot.on("message:location",this.onMessageLocation.bind(this)),this.bot.on("message:contact",this.onMessageContact.bind(this)),this.pages=this.pageLoads(),process.once("SIGINT",()=>this.bot.stop()),process.once("SIGTERM",()=>this.bot.stop()),i.deploy.startsWith("polling")?this.runPolling():i.deploy.startsWith("webhook")&&this.runWebhook(i.deploy.split("webhook:")[1])}onCatch(i){this.log?.error?.(`[Bot.catch]: ${String(i)}`)}onStart(i,s,e){let{username:t}=i;s=="polling"?this.log?.success?.(`Telegram bot polling started: ${t}`):this.log?.success?.(`Telegram bot webhook started: ${t} (${e})`)}initCtx(i){return new x({ct:i,cacheSession:this.cacheSession,cacheKeyboard:this.cacheKeyboard,templateManager:this.templateManager,temp:{session:{},data:{}}})}async runPolling(){this.bot.start({onStart:p(async i=>{this.onStart(i,"polling",null)},"onStart")})}async runWebhook(i){let s=(0,w.webhookCallback)(this.bot,"bun"),e="/telegram-webhook";(0,O.serve)({fetch(a){let{pathname:r}=new URL(a.url);if(r===e)return a.method==="POST"?s(a):new Response("OK",{status:200});if(r==="/"&&a.method==="GET"){let d=new Date().toISOString();return new Response(JSON.stringify({timestamp:d}),{status:200,headers:{"Content-Type":"application/json"}})}return new Response("Not found",{status:404})}});let t=await this.bot.api.getWebhookInfo(),o=i.endsWith("/")?i.slice(0,-1)+e:i+e;t.url!=o&&await this.bot.api.setWebhook(o);let n=await this.bot.api.getMe();this.onStart(n,"webhook",o)}pageCompile(i,s=!0){i?.template!==void 0?(this.templateManager.compile(i.data.name,i.template),s&&(i.template=void 0)):i.template=void 0}pageBuildData(i,s){i?.data===void 0&&(i.data=i.buildData()),i.data.name=(0,M.parse)(s).name}pageSorts(i,s){let e=i.data.name,t=i.prototype,o="Payload",n="Command",a="Caption",r="Free",d=s.dynamic,l=s.dynamicSpesific,c=p(h=>h.charAt(0).toUpperCase()+h.slice(1),"upFirst"),C=p(h=>h.replace(o,"").replace(n,"").replace(a,"").replace(r,""),"getPureFuncName"),m=p((h,b)=>t[`buildSessionMethod${c(h)}`](b),"buildSessionMethod");s.all[e]=i;for(let h=0;h<s.lenListFuncStaticSession;h++){let b=s.listFuncStaticSession[h],S=s.static[b],j=s.staticIntent[b],N=s.staticSession[b],A={name:e,func:b},I=S||j;if(I!==void 0){let Q=b.includes(n)?`/${e}`:e;I[t.buildIntent(Q,b.startsWith("callback"))]=A}N!==void 0&&(N[m(b,e)]=A),b.toLowerCase().endsWith("free")&&l[C(b)].push(A)}t.free&&d.push(e)}pageLoads(){this.log?.info?.("Load pages..");let i=(0,M.join)(process.cwd(),"src","pages");if(!(0,_.existsSync)(i))throw new Error(`Folder ${i} is not found, please make it manually`);let s=(0,_.readdirSync)(i),e={},t=e,o=e,n=[],a=["callback","text","textCommand","photoCaption","photoCaptionCommand","videoCaption","videoCaptionCommand","audioCaption","audioCaptionCommand","documentCaption","documentCaptionCommand","animationCaption","animationCaptionCommand","voiceCaption","voiceCaptionCommand","videoNoteCaption","videoNoteCaptionCommand"],r=["callbackPayload","textPayload","textCommandPayload","photoCaptionPayload","photoCaptionCommandPayload","videoCaptionPayload","videoCaptionCommandPayload","audioCaptionPayload","audioCaptionCommandPayload","documentCaptionPayload","documentCaptionCommandPayload","animationCaptionPayload","animationCaptionCommandPayload","voiceCaptionPayload","voiceCaptionCommandPayload","videoNoteCaptionPayload","videoNoteCaptionCommandPayload"],d=[...a,...r,"textFree","photoFree","videoFree","audioFree","documentFree","animationFree","voiceFree","videoNoteFree","stickerFree","locationFree","contactFree"],l=p((C,m)=>Object.fromEntries(C.map(h=>[h,{...m}])),"makeObject"),c={all:{},dynamic:[],dynamicSpesific:{text:n,photo:n,video:n,audio:n,document:n,animation:n,voice:n,videoNote:n,sticker:n,location:n,contact:n},static:l(a,e),staticIntent:l(r,t),staticSession:l(d,o),listFuncStatic:a,listFuncStaticIntent:r,listFuncStaticSession:d,lenListFuncStatic:a.length,lenListFuncStaticIntent:r.length,lenListFuncStaticSession:d.length};for(let C of s){let m=(0,M.join)(i,C),h=require(m),S=Object.values(h)[0];if(S===void 0)throw`file ${(0,M.parse)(m).name} must have export (not default) class page`;this.pageBuildData(S,m),this.pageCompile(S),this.pageSorts(S,c)}return this.log?.info?.(`Finish load pages with total (${Object.keys(c.all).length})`),c}async pageRoutes(i,s){let e,t;if(e===void 0){let n=i.callbackData,a=i.msgText,r=i.msgCaption,d=this.pages.static;for(let l=0;l<this.pages.lenListFuncStatic;l++){let c=this.pages.listFuncStatic[l];if(t=d[c][n||a||r],t)break}t!==void 0&&(e=this.pages.all[t.name])}if(e===void 0){let n=await i.sessionGet();if(n){let a=n.method,r=this.pages.staticSession;for(let d=0;d<this.pages.lenListFuncStaticSession;d++){let l=this.pages.listFuncStaticSession[d];if(t=r[l][a],t)break}t!==void 0&&(e=this.pages.all[t.name])}}if(e===void 0){let n=i.callbackDataIntent,a=i.msgTextIntent,r=i.msgCaptionIntent,d=this.pages.staticIntent;for(let l=0;l<this.pages.lenListFuncStaticIntent;l++){let c=this.pages.listFuncStaticIntent[l];if(t=d[c][n||a||r],t)break}t!==void 0&&(e=this.pages.all[t.name])}if(e!==void 0&&t!==void 0)return await new e(i)[t.func]?.();let o=this.pages.dynamicSpesific[s]||[];for(let n=0;n<o.length;n++){let a=o[n];if(a===void 0)continue;let r=this.pages.all[a.func];if(r===void 0)continue;let l=await new r(i)[a.name]?.();if(l!==null)return l}for(let n=0;n<this.pages.dynamic.length;n++){let a=this.pages.dynamic[n];if(a===void 0)continue;let r=this.pages.all[a];if(r===void 0)continue;let l=await new r(i).free?.();if(l!==null)return l}return null}async hookBeforeRoute(i,s){return!0}async hookErrorPage(i,s,e,t){}async hookErrorInputNotFoundPage(i){}async onMessage(i,s){let e=this.initCtx(i);try{if(await this.hookBeforeRoute(e,s)===!1)return;await this.pageRoutes(e,s)===null&&await this.hookErrorInputNotFoundPage(e)}catch(t){await this.hookErrorPage(e,s,t,!1)}}async onCallbackQueryData(i){let s=this.initCtx(i);try{if(await s.callbackQueryAnswer(),await this.hookBeforeRoute(s,"onCallbackQueryData")===!1)return;await this.pageRoutes(s,"callback")}catch(e){await this.hookErrorPage(s,"onCallbackQueryData",e,!0)}}async onMessageText(i){await this.onMessage(i,"onMessageText")}async onMessagePhoto(i){await this.onMessage(i,"onMessagePhoto")}async onMessageVideo(i){await this.onMessage(i,"onMessageVideo")}async onMessageAudio(i){await this.onMessage(i,"onMessageAudio")}async onMessageDocument(i){await this.onMessage(i,"onMessageDocument")}async onMessageAnimation(i){await this.onMessage(i,"onMessageAnimation")}async onMessageVoice(i){await this.onMessage(i,"onMessageVoice")}async onMessageVideoNote(i){await this.onMessage(i,"onMessageVideoNote")}async onMessageSticker(i){await this.onMessage(i,"onMessageSticker")}async onMessageLocation(i){await this.onMessage(i,"onMessageLocation")}async onMessageContact(i){await this.onMessage(i,"onMessageContact")}};0&&(module.exports={BaseGeneral,CacheExternal,Ctx,Gramstax,TemplateEngine,TemplateManager});
2
- //# sourceMappingURL=index.cjs.map
package/dist/src/index.js CHANGED
@@ -1,2 +1 @@
1
1
  var L=Object.defineProperty;var c=(h,i)=>L(h,"name",{value:i,configurable:!0}),T=(h=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(h,{get:(i,s)=>(typeof require<"u"?require:i)[s]}):h)(function(h){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+h+'" is not supported')});import{LoggingPretty as R}from"logging-pretty";var f=class{static{c(this,"BaseGeneral")}static log=new R;static logError(i,s){this.log.error(`[${this.toString().match(/class\s+([^\s{]+)/)?.[1]}:${s}]: ${String(i)}`)}logError(i,s,e){this.constructor.log.error(`[${s||this.constructor.name}:${e}] ${String(i)}`)}};import{Keyv as B}from"keyv";import E from"@keyv/redis";var S=class extends B{constructor(s="memory",e,t,o){let n;s.startsWith("redis")&&(n=new E(s)),s==="memory"&&(n=new Map),o?.forceStore&&(n=o.forceStore);super({store:n,namespace:e,ttl:t});this.url=s}static{c(this,"CacheExternal")}};import{setTimeout as O}from"timers/promises";import{InlineKeyboard as V,Keyboard as _}from"grammy";var P=class extends f{static{c(this,"Ctx")}static template;static data;data=this.constructor.data;get isPremium(){return this.ct.from?.is_premium??!1}get isBot(){return this.ct.from?.is_bot??!1}get userid(){return this.ct.from?.id}get username(){return this.ct.from?.username}get fullname(){return`${this.ct.from?.first_name||""}${this.ct.from?.last_name||""}`}get firstname(){return this.ct.from?.first_name}get lastname(){return this.ct.from?.last_name}get msgText(){return this.ct.message?.text}get msgTextIntent(){return this.msgText&&this.msgText.indexOf(" ")!=-1?this.msgText.split(" ")[0]:""}get msgTextPayloads(){return this.msgText&&this.msgText.indexOf(" ")!=-1?this.msgText.split(" ").slice(1):[]}get msgTextPayload(){return this.msgTextPayloads[0]}get msgCaption(){return this.ct.message?.caption}get msgCaptionIntent(){return this.msgCaption&&this.msgCaption.indexOf(" ")!=-1?this.msgCaption.split(" ")[0]:""}get msgPhoto(){return this.ct.message?.photo}get msgVideo(){return this.ct.message?.video}get msgAudio(){return this.ct.message?.audio}get callbackData(){return this.ct.callbackQuery?.data}get callbackDataIntent(){return this.callbackData&&this.callbackData.indexOf(":")!=-1?this.callbackData.split(":")[0]:""}get callbackDataPayloads(){return this.callbackData&&this.callbackData.indexOf(":")!=-1?this.callbackData.split(":").slice(1):[]}get callbackDataPayload(){return this.callbackDataPayloads?.[0]}get callbackDataParts(){return this.callbackDataPayload&&this.callbackDataPayload.indexOf("+")!=-1?this.callbackDataPayload.split("+"):[]}get languageCode(){return this.ct.from?.language_code}set languageCode(i){this.ct.from.language_code=i}set session(i){this.temp.session=i}get session(){return this.temp.session}ct;cacheSession;cacheKeyboard;templateManager;temp;constructor(i){super(),this.ct=i.ct,this.cacheSession=i.cacheSession,this.cacheKeyboard=i.cacheKeyboard,this.templateManager=i.templateManager,this.temp=i.temp,i?.data&&(this.temp.data=i.data)}async broadcast(i,s,e,t,o,n){let r=s.map(d=>this.templateManager.getMessage(this.data.name,o,d,t));for(let d=0;d<i.length;d++){let l=i[d],u=r[d];await this.ct.api.sendMessage(l,u,{parse_mode:"HTML",reply_markup:e,...n}),d+1==30&&await O(1200)}}async reply(i,s,e,t){let o=this.templateManager.getMessage(this.data.name,e,this.languageCode,s);return await this.ct.reply(o,{parse_mode:"HTML",reply_markup:i,...t})}async replyAction(i){return await this.ct.replyWithChatAction(i)}async edit(i,s,e,t){try{let o=this.templateManager.getMessage(this.data.name,e,this.languageCode,s);return await this.ct.editMessageText(o,{parse_mode:"HTML",reply_markup:i,...t})}catch{await this.reply(i,s,e,t)}}async delete(){return await this.ct.deleteMessage()}async callbackQueryAnswer(i){try{return await this.ct.answerCallbackQuery(i)}catch{return null}}async sessionSet(i,s,...e){try{let t={method:i,params:s,...e},o=await this.cacheSession.set(`${this.userid}`,{method:i,params:s,...e});return o&&(this.session=t),o}catch{return null}}async sessionGet(){try{let i=await this.cacheSession.get(`${this.userid}`);return i&&(this.session=i),i||null}catch{return null}}async sessionClear(){try{let i=await this.cacheSession.delete(`${this.userid}`);return i&&(this.session={}),i}catch{return null}}static buildData(i){return{name:"",callbackData:i?function(...s){let e=i(...s);return`${this.name}${e===void 0?"":`:${e}`}`}:function(){return this?.name}}}buildInlineKeyboard(i,s){let e=this.data.name;if(s?.cache===!0){let a=`${e}:${this.languageCode}:inline`,r=this.cacheKeyboard.get(a);if(!r){let d=new V,l=this.templateManager.getKeyboard(e,s?.baseId,this.languageCode,"inline",s?.data),u=i(d,l);return this.cacheKeyboard.set(a,u),u}return r}let t=new V,o=this.templateManager.getKeyboard(e,s?.baseId,this.languageCode,"inline",s?.data);return i(t,o)}buildKeyboard(i,s){let e=this.data.name;if(s?.cache===!0){let a=`${e}:${this.languageCode}:default`,r=this.cacheKeyboard.get(a);if(!r){let d=new _,l=this.templateManager.getKeyboard(e,s?.baseId,this.languageCode,"default",s?.data),u=i(d,l);return u.resized(!0),this.cacheKeyboard.set(a,u),u}return r}let t=new _,o=this.templateManager.getKeyboard(e,s?.baseId,this.languageCode,"default",s?.data),n=i(t,o);return n.resized(),n}validateSessionCallback(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodCallback(s)}validateSessionCallbackPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodCallbackPayload(s)}validateSessionText(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodText(s)}validateSessionTextPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodTextPayload(s)}validateSessionTextCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodTextCommand(s)}validateSessionTextCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodTextCommandPayload(s)}validateSessionTextFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodTextFree(s)}validateSessionPhotoCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodPhotoCaption(s)}validateSessionPhotoCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodPhotoCaptionPayload(s)}validateSessionPhotoCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodPhotoCaptionCommand(s)}validateSessionPhotoCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodPhotoCaptionCommandPayload(s)}validateSessionPhotoFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodPhotoFree(s)}validateSessionVideoCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoCaption(s)}validateSessionVideoCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoCaptionPayload(s)}validateSessionVideoCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoCaptionCommand(s)}validateSessionVideoCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoCaptionCommandPayload(s)}validateSessionVideoFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoFree(s)}validateSessionAudioCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAudioCaption(s)}validateSessionAudioCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAudioCaptionPayload(s)}validateSessionAudioCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAudioCaptionCommand(s)}validateSessionAudioCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAudioCaptionCommandPayload(s)}validateSessionAudioFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAudioFree(s)}validateSessionDocumentCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodDocumentCaption(s)}validateSessionDocumentCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodDocumentCaptionPayload(s)}validateSessionDocumentCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodDocumentCaptionCommand(s)}validateSessionDocumentCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodDocumentCaptionCommandPayload(s)}validateSessionDocumentFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodDocumentFree(s)}validateSessionAnimationCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAnimationCaption(s)}validateSessionAnimationCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAnimationCaptionPayload(s)}validateSessionAnimationCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAnimationCaptionCommand(s)}validateSessionAnimationCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAnimationCaptionCommandPayload(s)}validateSessionAnimationFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodAnimationFree(s)}validateSessionVoiceCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVoiceCaption(s)}validateSessionVoiceCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVoiceCaptionPayload(s)}validateSessionVoiceCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVoiceCaptionCommand(s)}validateSessionVoiceCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVoiceCaptionCommandPayload(s)}validateSessionVoiceFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVoiceFree(s)}validateSessionVideoNoteCaption(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoNoteCaption(s)}validateSessionVideoNoteCaptionPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoNoteCaptionPayload(s)}validateSessionVideoNoteCaptionCommand(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoNoteCaptionCommand(s)}validateSessionVideoNoteCaptionCommandPayload(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoNoteCaptionCommandPayload(s)}validateSessionVideoNoteFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodVideoNoteFree(s)}validateSessionStickerFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodStickerFree(s)}validateSessionLocationFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodLocationFree(s)}validateSessionContactFree(i,s){return i===void 0&&(i=this.session.method),i===void 0?!1:i===this.buildSessionMethodContactFree(s)}sessionCallback(i,s){return this.sessionSet(this.buildSessionMethodCallback(s),i)}sessionCallbackPayload(i,s){return this.sessionSet(this.buildSessionMethodCallbackPayload(s),i)}sessionText(i,s){return this.sessionSet(this.buildSessionMethodText(s),i)}sessionTextPayload(i,s){return this.sessionSet(this.buildSessionMethodTextPayload(s),i)}sessionTextCommand(i,s){return this.sessionSet(this.buildSessionMethodTextCommand(s),i)}sessionTextCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodTextCommandPayload(s),i)}sessionTextFree(i,s){return this.sessionSet(this.buildSessionMethodTextFree(s),i)}sessionPhotoCaption(i,s){return this.sessionSet(this.buildSessionMethodPhotoCaption(s),i)}sessionPhotoCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodPhotoCaptionPayload(s),i)}sessionPhotoCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodPhotoCaptionCommand(s),i)}sessionPhotoCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodPhotoCaptionCommandPayload(s),i)}sessionPhotoFree(i,s){return this.sessionSet(this.buildSessionMethodPhotoFree(s),i)}sessionVideoCaption(i,s){return this.sessionSet(this.buildSessionMethodVideoCaption(s),i)}sessionVideoCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodVideoCaptionPayload(s),i)}sessionVideoCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodVideoCaptionCommand(s),i)}sessionVideoCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodVideoCaptionCommandPayload(s),i)}sessionVideoFree(i,s){return this.sessionSet(this.buildSessionMethodVideoFree(s),i)}sessionAudioCaption(i,s){return this.sessionSet(this.buildSessionMethodAudioCaption(s),i)}sessionAudioCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodAudioCaptionPayload(s),i)}sessionAudioCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodAudioCaptionCommand(s),i)}sessionAudioCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodAudioCaptionCommandPayload(s),i)}sessionAudioFree(i,s){return this.sessionSet(this.buildSessionMethodAudioFree(s),i)}sessionDocumentCaption(i,s){return this.sessionSet(this.buildSessionMethodDocumentCaption(s),i)}sessionDocumentCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodDocumentCaptionPayload(s),i)}sessionDocumentCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodDocumentCaptionCommand(s),i)}sessionDocumentCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodDocumentCaptionCommandPayload(s),i)}sessionDocumentFree(i,s){return this.sessionSet(this.buildSessionMethodDocumentFree(s),i)}sessionAnimationCaption(i,s){return this.sessionSet(this.buildSessionMethodAnimationCaption(s),i)}sessionAnimationCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodAnimationCaptionPayload(s),i)}sessionAnimationCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodAnimationCaptionCommand(s),i)}sessionAnimationCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodAnimationCaptionCommandPayload(s),i)}sessionAnimationFree(i,s){return this.sessionSet(this.buildSessionMethodAnimationFree(s),i)}sessionVoiceCaption(i,s){return this.sessionSet(this.buildSessionMethodVoiceCaption(s),i)}sessionVoiceCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodVoiceCaptionPayload(s),i)}sessionVoiceCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodVoiceCaptionCommand(s),i)}sessionVoiceCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodVoiceCaptionCommandPayload(s),i)}sessionVoiceFree(i,s){return this.sessionSet(this.buildSessionMethodVoiceFree(s),i)}sessionVideoNoteCaption(i,s){return this.sessionSet(this.buildSessionMethodVideoNoteCaption(s),i)}sessionVideoNoteCaptionPayload(i,s){return this.sessionSet(this.buildSessionMethodVideoNoteCaptionPayload(s),i)}sessionVideoNoteCaptionCommand(i,s){return this.sessionSet(this.buildSessionMethodVideoNoteCaptionCommand(s),i)}sessionVideoNoteCaptionCommandPayload(i,s){return this.sessionSet(this.buildSessionMethodVideoNoteCaptionCommandPayload(s),i)}sessionVideoNoteFree(i,s){return this.sessionSet(this.buildSessionMethodVideoNoteFree(s),i)}sessionStickerFree(i,s){return this.sessionSet(this.buildSessionMethodStickerFree(s),i)}sessionLocationFree(i,s){return this.sessionSet(this.buildSessionMethodLocationFree(s),i)}sessionContactFree(i,s){return this.sessionSet(this.buildSessionMethodContactFree(s),i)}sessionToCallback(i,s){return this.sessionCallback({...this.session.params,...i},s)}sessionToCallbackPayload(i,s){return this.sessionCallbackPayload({...this.session.params,...i},s)}sessionToText(i,s){return this.sessionText({...this.session.params,...i},s)}sessionToTextPayload(i,s){return this.sessionTextPayload({...this.session.params,...i},s)}sessionToTextCommand(i,s){return this.sessionTextCommand({...this.session.params,...i},s)}sessionToTextCommandPayload(i,s){return this.sessionTextCommandPayload({...this.session.params,...i},s)}sessionToTextFree(i,s){return this.sessionTextFree({...this.session.params,...i},s)}sessionToPhotoCaption(i,s){return this.sessionPhotoCaption({...this.session.params,...i},s)}sessionToPhotoCaptionPayload(i,s){return this.sessionPhotoCaptionPayload({...this.session.params,...i},s)}sessionToPhotoCaptionCommand(i,s){return this.sessionPhotoCaptionCommand({...this.session.params,...i},s)}sessionToPhotoCaptionCommandPayload(i,s){return this.sessionPhotoCaptionCommandPayload({...this.session.params,...i},s)}sessionToPhotoFree(i,s){return this.sessionPhotoFree({...this.session.params,...i},s)}sessionToVideoCaption(i,s){return this.sessionVideoCaption({...this.session.params,...i},s)}sessionToVideoCaptionPayload(i,s){return this.sessionVideoCaptionPayload({...this.session.params,...i},s)}sessionToVideoCaptionCommand(i,s){return this.sessionVideoCaptionCommand({...this.session.params,...i},s)}sessionToVideoCaptionCommandPayload(i,s){return this.sessionVideoCaptionCommandPayload({...this.session.params,...i},s)}sessionToVideoFree(i,s){return this.sessionVideoFree({...this.session.params,...i},s)}sessionToAudioCaption(i,s){return this.sessionAudioCaption({...this.session.params,...i},s)}sessionToAudioCaptionPayload(i,s){return this.sessionAudioCaptionPayload({...this.session.params,...i},s)}sessionToAudioCaptionCommand(i,s){return this.sessionAudioCaptionCommand({...this.session.params,...i},s)}sessionToAudioCaptionCommandPayload(i,s){return this.sessionAudioCaptionCommandPayload({...this.session.params,...i},s)}sessionToAudioFree(i,s){return this.sessionAudioFree({...this.session.params,...i},s)}sessionToDocumentCaption(i,s){return this.sessionDocumentCaption({...this.session.params,...i},s)}sessionToDocumentCaptionPayload(i,s){return this.sessionDocumentCaptionPayload({...this.session.params,...i},s)}sessionToDocumentCaptionCommand(i,s){return this.sessionDocumentCaptionCommand({...this.session.params,...i},s)}sessionToDocumentCaptionCommandPayload(i,s){return this.sessionDocumentCaptionCommandPayload({...this.session.params,...i},s)}sessionToDocumentFree(i,s){return this.sessionDocumentFree({...this.session.params,...i},s)}sessionToAnimationCaption(i,s){return this.sessionAnimationCaption({...this.session.params,...i},s)}sessionToAnimationCaptionPayload(i,s){return this.sessionAnimationCaptionPayload({...this.session.params,...i},s)}sessionToAnimationCaptionCommand(i,s){return this.sessionAnimationCaptionCommand({...this.session.params,...i},s)}sessionToAnimationCaptionCommandPayload(i,s){return this.sessionAnimationCaptionCommandPayload({...this.session.params,...i},s)}sessionToAnimationFree(i,s){return this.sessionAnimationFree({...this.session.params,...i},s)}sessionToVoiceCaption(i,s){return this.sessionVoiceCaption({...this.session.params,...i},s)}sessionToVoiceCaptionPayload(i,s){return this.sessionVoiceCaptionPayload({...this.session.params,...i},s)}sessionToVoiceCaptionCommand(i,s){return this.sessionVoiceCaptionCommand({...this.session.params,...i},s)}sessionToVoiceCaptionCommandPayload(i,s){return this.sessionVoiceCaptionCommandPayload({...this.session.params,...i},s)}sessionToVoiceFree(i,s){return this.sessionVoiceFree({...this.session.params,...i},s)}sessionToVideoNoteCaption(i,s){return this.sessionVideoNoteCaption({...this.session.params,...i},s)}sessionToVideoNoteCaptionPayload(i,s){return this.sessionVideoNoteCaptionPayload({...this.session.params,...i},s)}sessionToVideoNoteCaptionCommand(i,s){return this.sessionVideoNoteCaptionCommand({...this.session.params,...i},s)}sessionToVideoNoteCaptionCommandPayload(i,s){return this.sessionVideoNoteCaptionCommandPayload({...this.session.params,...i},s)}sessionToVideoNoteFree(i,s){return this.sessionVideoNoteFree({...this.session.params,...i},s)}sessionToStickerFree(i,s){return this.sessionStickerFree({...this.session.params,...i},s)}sessionToLocationFree(i,s){return this.sessionLocationFree({...this.session.params,...i},s)}sessionToContactFree(i,s){return this.sessionContactFree({...this.session.params,...i},s)}buildIntent(i,s=!0){i||(i=s?this.data.callbackData():this.data.name);let e=s?":":" ";return i?.indexOf?.(e)!=-1?i?.split?.(e)?.[0]:i}buildSessionMethod(i,s){return`${i}-${s||this.data.name}`}buildSessionMethodCallback(i){return this.buildSessionMethod("1",i)}buildSessionMethodCallbackPayload(i){return this.buildSessionMethod("2",i)}buildSessionMethodText(i){return this.buildSessionMethod("3",i)}buildSessionMethodTextPayload(i){return this.buildSessionMethod("4",i)}buildSessionMethodTextCommand(i){return this.buildSessionMethod("5",i)}buildSessionMethodTextCommandPayload(i){return this.buildSessionMethod("6",i)}buildSessionMethodTextFree(i){return this.buildSessionMethod("7",i)}buildSessionMethodPhotoCaption(i){return this.buildSessionMethod("8",i)}buildSessionMethodPhotoCaptionPayload(i){return this.buildSessionMethod("9",i)}buildSessionMethodPhotoCaptionCommand(i){return this.buildSessionMethod("10",i)}buildSessionMethodPhotoCaptionCommandPayload(i){return this.buildSessionMethod("11",i)}buildSessionMethodPhotoFree(i){return this.buildSessionMethod("12",i)}buildSessionMethodVideoCaption(i){return this.buildSessionMethod("13",i)}buildSessionMethodVideoCaptionPayload(i){return this.buildSessionMethod("14",i)}buildSessionMethodVideoCaptionCommand(i){return this.buildSessionMethod("15",i)}buildSessionMethodVideoCaptionCommandPayload(i){return this.buildSessionMethod("16",i)}buildSessionMethodVideoFree(i){return this.buildSessionMethod("17",i)}buildSessionMethodAudioCaption(i){return this.buildSessionMethod("18",i)}buildSessionMethodAudioCaptionPayload(i){return this.buildSessionMethod("19",i)}buildSessionMethodAudioCaptionCommand(i){return this.buildSessionMethod("20",i)}buildSessionMethodAudioCaptionCommandPayload(i){return this.buildSessionMethod("21",i)}buildSessionMethodAudioFree(i){return this.buildSessionMethod("22",i)}buildSessionMethodDocumentCaption(i){return this.buildSessionMethod("23",i)}buildSessionMethodDocumentCaptionPayload(i){return this.buildSessionMethod("24",i)}buildSessionMethodDocumentCaptionCommand(i){return this.buildSessionMethod("25",i)}buildSessionMethodDocumentCaptionCommandPayload(i){return this.buildSessionMethod("26",i)}buildSessionMethodDocumentFree(i){return this.buildSessionMethod("27",i)}buildSessionMethodAnimationCaption(i){return this.buildSessionMethod("28",i)}buildSessionMethodAnimationCaptionPayload(i){return this.buildSessionMethod("29",i)}buildSessionMethodAnimationCaptionCommand(i){return this.buildSessionMethod("30",i)}buildSessionMethodAnimationCaptionCommandPayload(i){return this.buildSessionMethod("31",i)}buildSessionMethodAnimationFree(i){return this.buildSessionMethod("32",i)}buildSessionMethodVoiceCaption(i){return this.buildSessionMethod("33",i)}buildSessionMethodVoiceCaptionPayload(i){return this.buildSessionMethod("34",i)}buildSessionMethodVoiceCaptionCommand(i){return this.buildSessionMethod("35",i)}buildSessionMethodVoiceCaptionCommandPayload(i){return this.buildSessionMethod("36",i)}buildSessionMethodVoiceFree(i){return this.buildSessionMethod("37",i)}buildSessionMethodVideoNoteCaption(i){return this.buildSessionMethod("38",i)}buildSessionMethodVideoNoteCaptionPayload(i){return this.buildSessionMethod("39",i)}buildSessionMethodVideoNoteCaptionCommand(i){return this.buildSessionMethod("40",i)}buildSessionMethodVideoNoteCaptionCommandPayload(i){return this.buildSessionMethod("41",i)}buildSessionMethodVideoNoteFree(i){return this.buildSessionMethod("42",i)}buildSessionMethodStickerFree(i){return this.buildSessionMethod("43",i)}buildSessionMethodLocationFree(i){return this.buildSessionMethod("44",i)}buildSessionMethodContactFree(i){return this.buildSessionMethod("45",i)}};import{serve as q}from"bun";import{join as D,parse as N}from"path";import{LoggingPretty as X}from"logging-pretty";var C=class{static{c(this,"TemplateEngine")}static _escape(i){return i.replace(/\\/g,"\\\\").replace(/`/g,"\\`")}static _processVariables(i){return i.replace(/\{\{(\w+)\}\}/g,(s,e)=>`\${(data && data["${e}"]) ?? ""}`)}static _processBaseBlocks(i){let s=/<base\b[^>]*?(?:\sid=(["']?)([^"'\s>]+)\1)?[^>]*?>([\s\S]*?)<\/base>/g,e={};for(let t of i.matchAll(s)){let o=t[2]??"default",a=(t[3]??"").replace(/^[\t ]+/gm,"").replace(/^\n+/,"").replace(/\n+$/,"").trim();e[o]=a}return e}static _processScriptBlocks(i){return i.replace(/<script\b[^>]*>([\s\S]*?)<\/script>/gi,(s,e)=>{let t=e.trim();return t?`\${(() => { if (!data) return ''; try { with(data) { ${t} } } catch(e) { return '' } })()}`:""})}static _processSpaceBlocks(i){return i.replace(/^[ \t]*<space\s*\/>[ \t]*$/gim,"")}static _processDivBlocks(i){return i.replace(/<div>([\s\S]*?)<\/div>/gi,(s,e)=>e.replace(/^[\t ]+/gm,"").replace(/^\n+/,"").replace(/\n+$/,""))}static _processMessageBlocks(i){let s=/<message\s+lang="([^"]+)"\s*>([\s\S]*?)<\/message>/gi,e={};for(let[,t,o]of i.matchAll(s)){let n=o.replace(/^[\t ]+/gm,"").replace(/^\n+/,"").replace(/\n+$/,"").trim();e[t]=n}return e}static _processKeyboardBlocks(i){let s=/<keyboard\b[^>]*\blang="([^"]*)"[^>]*?(?:\sfor="([^"]*)")?[^>]*>([\s\S]*?)<\/keyboard>/gi,e={};for(let[,t,o,n]of i.matchAll(s)){let a=o==="default"?"default":"inline",r=n.trim();e[t]||(e[t]={}),e[t][a]=r}return e}static _compileToFunction(i,s){let e;s?e=i.map(n=>`\`${n}\``).join(","):e=`\`${i}\``;let t=e;if(t=this._processScriptBlocks(this._processDivBlocks(this._processSpaceBlocks(t))),s){let o=`return [${t}]`;return new Function("data",o)}else{let o=`return ${t}`;return new Function("data",o)}}static compileMessages(i){let s=this._processBaseBlocks(i),e={};for(let[t,o]of Object.entries(s)){let n=this._processMessageBlocks(o);e[t]={};for(let[a,r]of Object.entries(n)){let d=this._processVariables(this._processScriptBlocks(r));e[t][a]=this._compileToFunction(d,!1)}}return e}static compileKeyboards(i){let s=this._processBaseBlocks(i),e={};for(let[t,o]of Object.entries(s)){let n=this._processKeyboardBlocks(o);e[t]={};for(let[a,r]of Object.entries(n)){e[t][a]={};for(let[d,l]of Object.entries(r)){let g=l.split(/(?<!\\),\s*/).map(m=>m.replace(/\\,/g,",").trim()).map(m=>this._processVariables(this._processScriptBlocks(m)));e[t][a][d]=this._compileToFunction(g,!0)}}}return e}};import{readFile as W,mkdir as j}from"fs/promises";import{watch as Q}from"chokidar";import{basename as F,join as w,extname as z}from"path";import{readdirSync as G,readFileSync as U,existsSync as A,statSync as H,writeFileSync as J}from"fs";var M=class{static{c(this,"TemplateManager")}_map=new Map;_engine=C;_watcher=null;_supportedExtensions=new Set([".html"]);_path;_forceLanguage;_isWatchEnabled;constructor(i={}){let{enableWatch:s=!1,path:e=null,forceLanguage:t=null}=i;this._path=e,this._forceLanguage=t,this._isWatchEnabled=s,this._validatePath(),this._initializeWatcher(),this._loadAllFiles()}_validatePath(){try{if(this._path===null||!A(this._path))return;if(!H(this._path).isDirectory())throw new Error(`Template path is not a directory: ${this._path}`)}catch(i){throw new Error(`Failed to validate Template path: ${i}`)}}_initializeWatcher(){this._path===null||!this._isWatchEnabled||(this._watcher=Q(this._path,{persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50}}),this._watcher.on("change",this._handleFileChange.bind(this)),this._watcher.on("add",this._handleFileAdd.bind(this)),this._watcher.on("unlink",this._handleFileDelete.bind(this)),this._watcher.on("error",this._handleWatchError.bind(this)))}async _handleFileChange(i){let s=F(i);this._isValidFile(s)&&await this._loadFile(s,!1)}async _handleFileAdd(i){let s=F(i);this._isValidFile(s)&&await this._loadFile(s,!1)}_handleFileDelete(i){let s=F(i),e=this._getKey(s);this._map.has(e)&&this._map.delete(e)}_handleWatchError(i){}_loadAllFiles(){if(this._path===null||!A(this._path))return;let s=G(this._path,{encoding:"utf8"}).filter(e=>this._isValidFile(e));for(let e of s)this._loadFile(e,!0)}async _loadFile(i,s=!0){if(this._path===null)return;let e=w(this._path,i),t=this._getKey(i),o=s?U(e,{encoding:"utf8"}):await W(e,{encoding:"utf8"});this.compile(t,o)}_isValidFile(i){let s=z(i).toLowerCase();return this._supportedExtensions.has(s)}_getKey(i){return i.replace(/\.[^/.]+$/,"")}compile(i,s,e){let t=this._map.get(i),o=t||{},n=!1;(e===void 0||e?.message===!1||t?.message===void 0)&&(o.message=C.compileMessages(s),n=!0),(e===void 0||e?.keyboard===!1||t?.keyboard===void 0)&&(o.keyboard=C.compileKeyboards(s),n=!0),n&&this._map.set(i,o)}getMessage(i,s="default",e="en",t){let n=this._map.get(i)?.message?.[s]?.[this._forceLanguage||e];if(!n)return"";try{return n(t)}catch{return""}}getKeyboard(i,s="default",e="en",t="inline",o){let a=this._map.get(i)?.keyboard?.[s]?.[this._forceLanguage||e]?.[t];if(!a)return[];try{return a(o)}catch{return[]}}setMessage(i,s){this.compile(i,s,{keyboard:!0})}setKeyboard(i,s){this.compile(i,s,{message:!0})}async write(i,s){if(this._path===null)return;let e=w(this._path,i);await j(this._path,{recursive:!0}),J(e,s,{encoding:"utf8"}),await this._loadFile(i,!1)}getAvailable(){return Array.from(this._map.keys())}has(i){return this._map.has(i)}getCacheStats(){return{templateCount:this._map.size,totalSize:JSON.stringify(this._map.entries().toArray(),(i,s)=>typeof s=="function"?s.toString():s).length}}async destroy(){this._watcher&&await this._watcher.close(),this._map.clear()}};import{existsSync as Y,readdirSync as Z}from"fs";import{Bot as ii,webhookCallback as si}from"grammy";var I=class{static{c(this,"Gramstax")}templateManager;cacheKeyboard;cacheSession;pages;log;bot;constructor(i){this.log=i.log===null?void 0:i.log===void 0?new X:i.log,this.cacheSession=i.cacheSession||new S("memory","session"),this.cacheKeyboard=i.cacheKeyboard||new Map,this.templateManager=i.templateManager||new M({path:null}),this.bot=new ii(i.token),this.bot.catch(this.onCatch),this.bot.on("callback_query:data",this.onCallbackQueryData.bind(this)),this.bot.on("message:text",this.onMessageText.bind(this)),this.bot.on("message:photo",this.onMessagePhoto.bind(this)),this.bot.on("message:video",this.onMessageVideo.bind(this)),this.bot.on("message:audio",this.onMessageAudio.bind(this)),this.bot.on("message:document",this.onMessageDocument.bind(this)),this.bot.on("message:animation",this.onMessageAnimation.bind(this)),this.bot.on("message:voice",this.onMessageVoice.bind(this)),this.bot.on("message:video_note",this.onMessageVideoNote.bind(this)),this.bot.on("message:sticker",this.onMessageSticker.bind(this)),this.bot.on("message:location",this.onMessageLocation.bind(this)),this.bot.on("message:contact",this.onMessageContact.bind(this)),this.pages=this.pageLoads(),process.once("SIGINT",()=>this.bot.stop()),process.once("SIGTERM",()=>this.bot.stop()),i.deploy.startsWith("polling")?this.runPolling():i.deploy.startsWith("webhook")&&this.runWebhook(i.deploy.split("webhook:")[1])}onCatch(i){this.log?.error?.(`[Bot.catch]: ${String(i)}`)}onStart(i,s,e){let{username:t}=i;s=="polling"?this.log?.success?.(`Telegram bot polling started: ${t}`):this.log?.success?.(`Telegram bot webhook started: ${t} (${e})`)}initCtx(i){return new P({ct:i,cacheSession:this.cacheSession,cacheKeyboard:this.cacheKeyboard,templateManager:this.templateManager,temp:{session:{},data:{}}})}async runPolling(){this.bot.start({onStart:c(async i=>{this.onStart(i,"polling",null)},"onStart")})}async runWebhook(i){let s=si(this.bot,"bun"),e="/telegram-webhook";q({fetch(a){let{pathname:r}=new URL(a.url);if(r===e)return a.method==="POST"?s(a):new Response("OK",{status:200});if(r==="/"&&a.method==="GET"){let d=new Date().toISOString();return new Response(JSON.stringify({timestamp:d}),{status:200,headers:{"Content-Type":"application/json"}})}return new Response("Not found",{status:404})}});let t=await this.bot.api.getWebhookInfo(),o=i.endsWith("/")?i.slice(0,-1)+e:i+e;t.url!=o&&await this.bot.api.setWebhook(o);let n=await this.bot.api.getMe();this.onStart(n,"webhook",o)}pageCompile(i,s=!0){i?.template!==void 0?(this.templateManager.compile(i.data.name,i.template),s&&(i.template=void 0)):i.template=void 0}pageBuildData(i,s){i?.data===void 0&&(i.data=i.buildData()),i.data.name=N(s).name}pageSorts(i,s){let e=i.data.name,t=i.prototype,o="Payload",n="Command",a="Caption",r="Free",d=s.dynamic,l=s.dynamicSpesific,u=c(p=>p.charAt(0).toUpperCase()+p.slice(1),"upFirst"),g=c(p=>p.replace(o,"").replace(n,"").replace(a,"").replace(r,""),"getPureFuncName"),m=c((p,b)=>t[`buildSessionMethod${u(p)}`](b),"buildSessionMethod");s.all[e]=i;for(let p=0;p<s.lenListFuncStaticSession;p++){let b=s.listFuncStaticSession[p],y=s.static[b],K=s.staticIntent[b],k=s.staticSession[b],v={name:e,func:b},x=y||K;if(x!==void 0){let $=b.includes(n)?`/${e}`:e;x[t.buildIntent($,b.startsWith("callback"))]=v}k!==void 0&&(k[m(b,e)]=v),b.toLowerCase().endsWith("free")&&l[g(b)].push(v)}t.free&&d.push(e)}pageLoads(){this.log?.info?.("Load pages..");let i=D(process.cwd(),"src","pages");if(!Y(i))throw new Error(`Folder ${i} is not found, please make it manually`);let s=Z(i),e={},t=e,o=e,n=[],a=["callback","text","textCommand","photoCaption","photoCaptionCommand","videoCaption","videoCaptionCommand","audioCaption","audioCaptionCommand","documentCaption","documentCaptionCommand","animationCaption","animationCaptionCommand","voiceCaption","voiceCaptionCommand","videoNoteCaption","videoNoteCaptionCommand"],r=["callbackPayload","textPayload","textCommandPayload","photoCaptionPayload","photoCaptionCommandPayload","videoCaptionPayload","videoCaptionCommandPayload","audioCaptionPayload","audioCaptionCommandPayload","documentCaptionPayload","documentCaptionCommandPayload","animationCaptionPayload","animationCaptionCommandPayload","voiceCaptionPayload","voiceCaptionCommandPayload","videoNoteCaptionPayload","videoNoteCaptionCommandPayload"],d=[...a,...r,"textFree","photoFree","videoFree","audioFree","documentFree","animationFree","voiceFree","videoNoteFree","stickerFree","locationFree","contactFree"],l=c((g,m)=>Object.fromEntries(g.map(p=>[p,{...m}])),"makeObject"),u={all:{},dynamic:[],dynamicSpesific:{text:n,photo:n,video:n,audio:n,document:n,animation:n,voice:n,videoNote:n,sticker:n,location:n,contact:n},static:l(a,e),staticIntent:l(r,t),staticSession:l(d,o),listFuncStatic:a,listFuncStaticIntent:r,listFuncStaticSession:d,lenListFuncStatic:a.length,lenListFuncStaticIntent:r.length,lenListFuncStaticSession:d.length};for(let g of s){let m=D(i,g),p=T(m),y=Object.values(p)[0];if(y===void 0)throw`file ${N(m).name} must have export (not default) class page`;this.pageBuildData(y,m),this.pageCompile(y),this.pageSorts(y,u)}return this.log?.info?.(`Finish load pages with total (${Object.keys(u.all).length})`),u}async pageRoutes(i,s){let e,t;if(e===void 0){let n=i.callbackData,a=i.msgText,r=i.msgCaption,d=this.pages.static;for(let l=0;l<this.pages.lenListFuncStatic;l++){let u=this.pages.listFuncStatic[l];if(t=d[u][n||a||r],t)break}t!==void 0&&(e=this.pages.all[t.name])}if(e===void 0){let n=await i.sessionGet();if(n){let a=n.method,r=this.pages.staticSession;for(let d=0;d<this.pages.lenListFuncStaticSession;d++){let l=this.pages.listFuncStaticSession[d];if(t=r[l][a],t)break}t!==void 0&&(e=this.pages.all[t.name])}}if(e===void 0){let n=i.callbackDataIntent,a=i.msgTextIntent,r=i.msgCaptionIntent,d=this.pages.staticIntent;for(let l=0;l<this.pages.lenListFuncStaticIntent;l++){let u=this.pages.listFuncStaticIntent[l];if(t=d[u][n||a||r],t)break}t!==void 0&&(e=this.pages.all[t.name])}if(e!==void 0&&t!==void 0)return await new e(i)[t.func]?.();let o=this.pages.dynamicSpesific[s]||[];for(let n=0;n<o.length;n++){let a=o[n];if(a===void 0)continue;let r=this.pages.all[a.func];if(r===void 0)continue;let l=await new r(i)[a.name]?.();if(l!==null)return l}for(let n=0;n<this.pages.dynamic.length;n++){let a=this.pages.dynamic[n];if(a===void 0)continue;let r=this.pages.all[a];if(r===void 0)continue;let l=await new r(i).free?.();if(l!==null)return l}return null}async hookBeforeRoute(i,s){return!0}async hookErrorPage(i,s,e,t){}async hookErrorInputNotFoundPage(i){}async onMessage(i,s){let e=this.initCtx(i);try{if(await this.hookBeforeRoute(e,s)===!1)return;await this.pageRoutes(e,s)===null&&await this.hookErrorInputNotFoundPage(e)}catch(t){await this.hookErrorPage(e,s,t,!1)}}async onCallbackQueryData(i){let s=this.initCtx(i);try{if(await s.callbackQueryAnswer(),await this.hookBeforeRoute(s,"onCallbackQueryData")===!1)return;await this.pageRoutes(s,"callback")}catch(e){await this.hookErrorPage(s,"onCallbackQueryData",e,!0)}}async onMessageText(i){await this.onMessage(i,"onMessageText")}async onMessagePhoto(i){await this.onMessage(i,"onMessagePhoto")}async onMessageVideo(i){await this.onMessage(i,"onMessageVideo")}async onMessageAudio(i){await this.onMessage(i,"onMessageAudio")}async onMessageDocument(i){await this.onMessage(i,"onMessageDocument")}async onMessageAnimation(i){await this.onMessage(i,"onMessageAnimation")}async onMessageVoice(i){await this.onMessage(i,"onMessageVoice")}async onMessageVideoNote(i){await this.onMessage(i,"onMessageVideoNote")}async onMessageSticker(i){await this.onMessage(i,"onMessageSticker")}async onMessageLocation(i){await this.onMessage(i,"onMessageLocation")}async onMessageContact(i){await this.onMessage(i,"onMessageContact")}};export{f as BaseGeneral,S as CacheExternal,P as Ctx,I as Gramstax,C as TemplateEngine,M as TemplateManager};
2
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gramstax",
3
- "version": "0.0.14",
3
+ "version": "0.0.15",
4
4
  "private": false,
5
5
  "description": "A powerful Telegram bot framework with page-based routing and template system",
6
6
  "keywords": [
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/base/general.ts","../../src/cache/external.ts","../../src/core/ctx.ts","../../src/core/bot.ts","../../src/template/engine.ts","../../src/template/manager.ts"],"sourcesContent":["export * from \"./base\"\r\nexport * from \"./cache\"\r\nexport * from \"./core\"\r\nexport * from \"./template\"\r\n","import { LoggingPretty } from \"logging-pretty\"\r\n\r\nexport abstract class BaseGeneral {\r\n public static log = new LoggingPretty()\r\n public static logError(error: any, func: string) {\r\n // const name = typeof this.name != `string` ? this.toString().match(/class\\s+([^\\s{]+)/)?.[1] : this.name\r\n this.log.error(`[${this.toString().match(/class\\s+([^\\s{]+)/)?.[1]}:${func}]: ${String(error)}`)\r\n }\r\n\r\n // protected logError(error: any, func: string, name?: string) {\r\n // log.error(`[${name || this.constructor.name}:${func}]: ${String(error)}`)\r\n // }\r\n\r\n public logError(error: any, constructorName?: string, funcName?: string) {\r\n ;(this.constructor as any).log.error(`[${constructorName || this.constructor.name}:${funcName}] ${String(error)}`)\r\n }\r\n}\r\n","import { Keyv } from \"keyv\"\r\nimport KeyvRedis from \"@keyv/redis\"\r\n\r\ntype IMore = Omit<Required<ConstructorParameters<typeof Keyv>>[0], `store` | `namespace` | `ttl`> & { forceStore?: any }\r\n\r\nexport class CacheExternal extends Keyv {\r\n constructor(public url: string | `memory` = `memory`, namespace?: string, ttl?: number, more?: IMore) {\r\n let store: any\r\n if (url.startsWith(`redis`)) store = new KeyvRedis(url)\r\n if (url === `memory`) store = new Map()\r\n if (more?.forceStore) store = more.forceStore\r\n\r\n super({ store, namespace, ttl })\r\n }\r\n}\r\n","import { setTimeout } from \"node:timers/promises\"\r\nimport { BaseGeneral } from \"../base\"\r\nimport { CacheExternal } from \"../cache\"\r\nimport { TemplateManager } from \"../template\"\r\nimport { InlineKeyboard, Keyboard, type Context } from \"grammy\"\r\n\r\ntype IData = { name: string; callbackData: (...args: any) => string | any }\r\ntype ITemp = { session: { method?: string; params?: any }; data: Partial<IData>; [key: string]: any }\r\n\r\nexport class Ctx extends BaseGeneral {\r\n public static template?: string // string html\r\n public static data: IData // for external access (**.data). example StartPage.data.callbackData\r\n public data = (this as any).constructor.data as IData // for internal access (this.**). example this.data.callbackData\r\n\r\n public get isPremium() {\r\n return this.ct.from?.is_premium ?? false\r\n }\r\n public get isBot() {\r\n return this.ct.from?.is_bot ?? false\r\n }\r\n public get userid() {\r\n return this.ct.from?.id as number\r\n }\r\n public get username() {\r\n return this.ct.from?.username as string\r\n }\r\n public get fullname() {\r\n return `${this.ct.from?.first_name || ``}${this.ct.from?.last_name || ``}`\r\n }\r\n public get firstname() {\r\n return this.ct.from?.first_name as string\r\n }\r\n public get lastname() {\r\n return this.ct.from?.last_name as string\r\n }\r\n public get msgText() {\r\n return this.ct.message?.text as string\r\n }\r\n public get msgTextIntent() {\r\n return this.msgText && this.msgText.indexOf(` `) != -1 ? (this.msgText.split(` `)[0] as string) : ``\r\n }\r\n public get msgTextPayloads() {\r\n return this.msgText && this.msgText.indexOf(` `) != -1 ? (this.msgText.split(` `).slice(1) as any[]) : ([] as any[])\r\n }\r\n public get msgTextPayload() {\r\n return this.msgTextPayloads[0] as string\r\n }\r\n public get msgCaption() {\r\n return this.ct.message?.caption as string\r\n }\r\n public get msgCaptionIntent() {\r\n return this.msgCaption && this.msgCaption.indexOf(` `) != -1 ? (this.msgCaption.split(` `)[0] as string) : ``\r\n }\r\n public get msgPhoto() {\r\n return this.ct.message?.photo\r\n }\r\n public get msgVideo() {\r\n return this.ct.message?.video\r\n }\r\n public get msgAudio() {\r\n return this.ct.message?.audio\r\n }\r\n public get callbackData() {\r\n return this.ct.callbackQuery?.data as string\r\n }\r\n public get callbackDataIntent() {\r\n return this.callbackData && this.callbackData.indexOf(`:`) != -1 ? (this.callbackData.split(`:`)[0] as string) : ``\r\n }\r\n public get callbackDataPayloads() {\r\n return this.callbackData && this.callbackData.indexOf(`:`) != -1 ? (this.callbackData.split(`:`).slice(1) as any[]) : ([] as any[])\r\n }\r\n public get callbackDataPayload() {\r\n return this.callbackDataPayloads?.[0] as string\r\n }\r\n public get callbackDataParts() {\r\n return this.callbackDataPayload && this.callbackDataPayload.indexOf(`+`) != -1 ? (this.callbackDataPayload.split(`+`) as any[]) : ([] as any[])\r\n }\r\n public get languageCode() {\r\n return this.ct.from?.language_code as string\r\n }\r\n public set languageCode(v: any) {\r\n ;(this as any).ct.from.language_code = v\r\n }\r\n public set session(v: any) {\r\n this.temp.session = v\r\n }\r\n public get session() {\r\n return this.temp.session\r\n }\r\n\r\n public ct: Context\r\n public cacheSession: CacheExternal\r\n public cacheKeyboard: Map<any, any>\r\n public templateManager: TemplateManager\r\n public temp: ITemp\r\n public constructor(params: { ct: Context; cacheSession: CacheExternal; cacheKeyboard: Map<any, any>; templateManager: TemplateManager; temp: ITemp }) {\r\n super()\r\n this.ct = params.ct\r\n this.cacheSession = params.cacheSession\r\n this.cacheKeyboard = params.cacheKeyboard\r\n this.templateManager = params.templateManager\r\n this.temp = params.temp\r\n if ((params as any)?.data) {\r\n this.temp.data = (params as any).data\r\n }\r\n }\r\n\r\n public async broadcast(ids: any[], languageCode: any[], keyboard?: Keyboard | InlineKeyboard, data?: Record<string, any>, baseId?: string, options?: any) {\r\n const limitFree = 30\r\n const msgs = languageCode.map((it) => this.templateManager.getMessage(this.data.name, baseId, it, data)) as any[]\r\n for (let index = 0; index < ids.length; index++) {\r\n const id = ids[index]\r\n const msg = msgs[index]\r\n await this.ct.api.sendMessage(id, msg, {\r\n parse_mode: `HTML`,\r\n reply_markup: keyboard,\r\n ...options\r\n })\r\n\r\n if (index + 1 == limitFree) {\r\n await setTimeout(1200)\r\n }\r\n }\r\n }\r\n\r\n public async reply(keyboard?: Keyboard | InlineKeyboard, data?: Record<string, any>, baseId?: string, options?: any) {\r\n const msg = this.templateManager.getMessage(this.data.name, baseId, this.languageCode, data)\r\n return await this.ct.reply(msg, {\r\n parse_mode: `HTML`,\r\n reply_markup: keyboard,\r\n ...options\r\n })\r\n }\r\n\r\n public async replyAction(type: Parameters<typeof this.ct.replyWithChatAction>[0]) {\r\n return await this.ct.replyWithChatAction(type)\r\n }\r\n\r\n public async edit(keyboard?: Keyboard | InlineKeyboard, data?: Record<string, any>, baseId?: string, options?: any) {\r\n try {\r\n const msg = this.templateManager.getMessage(this.data.name, baseId, this.languageCode, data)\r\n return await this.ct.editMessageText(msg, {\r\n parse_mode: `HTML`,\r\n reply_markup: keyboard,\r\n ...options\r\n })\r\n } catch (error) {\r\n await this.reply(keyboard, data, baseId, options)\r\n }\r\n }\r\n\r\n public async delete() {\r\n return await this.ct.deleteMessage()\r\n }\r\n\r\n public async callbackQueryAnswer(options?: any) {\r\n try {\r\n return await this.ct.answerCallbackQuery(options)\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n public async sessionSet(method: string, params: any, ...moreRoot: any) {\r\n try {\r\n const value = { method, params, ...moreRoot }\r\n const result = await this.cacheSession.set(`${this.userid}`, { method, params, ...moreRoot })\r\n if (result) {\r\n this.session = value\r\n }\r\n return result\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n public async sessionGet(): Promise<{ method: string; params: any; [moreRoot: string]: any } | null> {\r\n try {\r\n const result = await this.cacheSession.get(`${this.userid}`)\r\n if (result) {\r\n this.session = result\r\n }\r\n return result || null\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n public async sessionClear() {\r\n try {\r\n const result = await this.cacheSession.delete(`${this.userid}`)\r\n if (result) {\r\n this.session = {}\r\n }\r\n return result\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n // =============== build data\r\n\r\n public static buildData<C extends ((...args: any[]) => any) | undefined = undefined>(callback?: C) {\r\n return {\r\n name: ``,\r\n callbackData: callback\r\n ? function (this: { name: string }, ...args: Parameters<Exclude<C, undefined>>): ReturnType<Exclude<C, undefined>> {\r\n const params = callback(...args)\r\n return `${this.name}${params === undefined ? `` : `:${params}`}` as any\r\n }\r\n : function (this: { name: string }) {\r\n return this?.name\r\n }\r\n }\r\n }\r\n\r\n // =============== build keyboard\r\n\r\n public buildInlineKeyboard(callback: (kb: InlineKeyboard, arr: any[]) => InlineKeyboard, params?: { baseId?: any; data?: Record<string, any>; cache?: boolean }): InlineKeyboard {\r\n const tkey = this.data.name\r\n if (params?.cache === true) {\r\n const key = `${tkey}:${this.languageCode}:inline`\r\n const ckb = this.cacheKeyboard.get(key)\r\n if (!ckb) {\r\n const ikb = new InlineKeyboard()\r\n const arr = this.templateManager.getKeyboard(tkey, params?.baseId, this.languageCode, `inline`, params?.data)\r\n const rkb = callback(ikb, arr)\r\n this.cacheKeyboard.set(key, rkb)\r\n return rkb\r\n }\r\n return ckb\r\n }\r\n const ikb = new InlineKeyboard()\r\n const arr = this.templateManager.getKeyboard(tkey, params?.baseId, this.languageCode, `inline`, params?.data)\r\n const rkb = callback(ikb, arr)\r\n return rkb\r\n }\r\n\r\n public buildKeyboard(callback: (kb: Keyboard, arr: any[]) => Keyboard, params?: { baseId?: any; data?: Record<string, any>; cache?: boolean }): Keyboard {\r\n const tkey = this.data.name\r\n if (params?.cache === true) {\r\n const key = `${tkey}:${this.languageCode}:default`\r\n const ckb = this.cacheKeyboard.get(key)\r\n if (!ckb) {\r\n const kb = new Keyboard()\r\n const arr = this.templateManager.getKeyboard(tkey, params?.baseId, this.languageCode, `default`, params?.data)\r\n const rkb = callback(kb, arr)\r\n rkb.resized(true)\r\n this.cacheKeyboard.set(key, rkb)\r\n return rkb\r\n }\r\n return ckb\r\n }\r\n const kb = new Keyboard()\r\n const arr = this.templateManager.getKeyboard(tkey, params?.baseId, this.languageCode, `default`, params?.data)\r\n const rkb = callback(kb, arr)\r\n rkb.resized()\r\n return rkb\r\n }\r\n\r\n // =============== most common used function\r\n public async transition?(...args: any): Promise<void>\r\n public async internal?(...args: any): Promise<void>\r\n public async notify?(...args: any): Promise<void>\r\n\r\n // =============== route function\r\n // callback\r\n public async callback?(): Promise<void> // example: start\r\n public async callbackPayload?(): Promise<void> // example: start:{DYNAMIC}\r\n // text\r\n public async text?(): Promise<void> // example: start\r\n public async textPayload?(): Promise<void> // example: start {...DYNAMIC}\r\n public async textCommand?(): Promise<void> // example: /start\r\n public async textCommandPayload?(): Promise<void> // example: /start {...DYNAMIC}\r\n public async textFree?(): Promise<void> // example (for session): {...DYNAMIC}\r\n\r\n // photo\r\n public async photoCaption?(): Promise<void>\r\n public async photoCaptionPayload?(): Promise<void>\r\n public async photoCaptionCommand?(): Promise<void>\r\n public async photoCaptionCommandPayload?(): Promise<void>\r\n public async photoFree?(): Promise<void>\r\n // video\r\n public async videoCaption?(): Promise<void>\r\n public async videoCaptionPayload?(): Promise<void>\r\n public async videoCaptionCommand?(): Promise<void>\r\n public async videoCaptionCommandPayload?(): Promise<void>\r\n public async videoFree?(): Promise<void>\r\n // audio\r\n public async audioCaption?(): Promise<void>\r\n public async audioCaptionPayload?(): Promise<void>\r\n public async audioCaptionCommand?(): Promise<void>\r\n public async audioCaptionCommandPayload?(): Promise<void>\r\n public async audioFree?(): Promise<void>\r\n // document\r\n public async documentCaption?(): Promise<void>\r\n public async documentCaptionPayload?(): Promise<void>\r\n public async documentCaptionCommand?(): Promise<void>\r\n public async documentCaptionCommandPayload?(): Promise<void>\r\n public async documentFree?(): Promise<void>\r\n // animation\r\n public async animationCaption?(): Promise<void>\r\n public async animationCaptionPayload?(): Promise<void>\r\n public async animationCaptionCommand?(): Promise<void>\r\n public async animationCaptionCommandPayload?(): Promise<void>\r\n public async animationFree?(): Promise<void>\r\n // voiceNote\r\n public async voiceCaption?(): Promise<void>\r\n public async voiceCaptionPayload?(): Promise<void>\r\n public async voiceCaptionCommand?(): Promise<void>\r\n public async voiceCaptionCommandPayload?(): Promise<void>\r\n public async voiceFree?(): Promise<void>\r\n // videoNote\r\n public async videoNoteCaption?(): Promise<void>\r\n public async videoNoteCaptionPayload?(): Promise<void>\r\n public async videoNoteCaptionCommand?(): Promise<void>\r\n public async videoNoteCaptionCommandPayload?(): Promise<void>\r\n public async videoNoteFree?(): Promise<void>\r\n // sticker\r\n public async stickerFree?(): Promise<void>\r\n // location\r\n public async locationFree?(): Promise<void>\r\n // contact\r\n public async contactFree?(): Promise<void>\r\n // all\r\n public async free?(): Promise<void>\r\n\r\n // =============== session validate\r\n // callback\r\n\r\n public validateSessionCallback(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodCallback(name)\r\n }\r\n\r\n public validateSessionCallbackPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodCallbackPayload(name)\r\n }\r\n\r\n // text\r\n\r\n public validateSessionText(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodText(name)\r\n }\r\n\r\n public validateSessionTextPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodTextPayload(name)\r\n }\r\n\r\n public validateSessionTextCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodTextCommand(name)\r\n }\r\n\r\n public validateSessionTextCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodTextCommandPayload(name)\r\n }\r\n\r\n public validateSessionTextFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodTextFree(name)\r\n }\r\n\r\n // photo\r\n\r\n public validateSessionPhotoCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodPhotoCaption(name)\r\n }\r\n\r\n public validateSessionPhotoCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodPhotoCaptionPayload(name)\r\n }\r\n\r\n public validateSessionPhotoCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodPhotoCaptionCommand(name)\r\n }\r\n\r\n public validateSessionPhotoCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodPhotoCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionPhotoFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodPhotoFree(name)\r\n }\r\n\r\n // video\r\n\r\n public validateSessionVideoCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoCaption(name)\r\n }\r\n\r\n public validateSessionVideoCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoCaptionPayload(name)\r\n }\r\n\r\n public validateSessionVideoCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoCaptionCommand(name)\r\n }\r\n\r\n public validateSessionVideoCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionVideoFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoFree(name)\r\n }\r\n\r\n // audio\r\n\r\n public validateSessionAudioCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAudioCaption(name)\r\n }\r\n\r\n public validateSessionAudioCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAudioCaptionPayload(name)\r\n }\r\n\r\n public validateSessionAudioCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAudioCaptionCommand(name)\r\n }\r\n\r\n public validateSessionAudioCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAudioCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionAudioFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAudioFree(name)\r\n }\r\n\r\n // document\r\n\r\n public validateSessionDocumentCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodDocumentCaption(name)\r\n }\r\n\r\n public validateSessionDocumentCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodDocumentCaptionPayload(name)\r\n }\r\n\r\n public validateSessionDocumentCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodDocumentCaptionCommand(name)\r\n }\r\n\r\n public validateSessionDocumentCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodDocumentCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionDocumentFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodDocumentFree(name)\r\n }\r\n\r\n // animation\r\n\r\n public validateSessionAnimationCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAnimationCaption(name)\r\n }\r\n\r\n public validateSessionAnimationCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAnimationCaptionPayload(name)\r\n }\r\n\r\n public validateSessionAnimationCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAnimationCaptionCommand(name)\r\n }\r\n\r\n public validateSessionAnimationCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAnimationCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionAnimationFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAnimationFree(name)\r\n }\r\n\r\n // voice\r\n\r\n public validateSessionVoiceCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVoiceCaption(name)\r\n }\r\n\r\n public validateSessionVoiceCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVoiceCaptionPayload(name)\r\n }\r\n\r\n public validateSessionVoiceCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVoiceCaptionCommand(name)\r\n }\r\n\r\n public validateSessionVoiceCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVoiceCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionVoiceFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVoiceFree(name)\r\n }\r\n\r\n // video note\r\n\r\n public validateSessionVideoNoteCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoNoteCaption(name)\r\n }\r\n\r\n public validateSessionVideoNoteCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoNoteCaptionPayload(name)\r\n }\r\n\r\n public validateSessionVideoNoteCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoNoteCaptionCommand(name)\r\n }\r\n\r\n public validateSessionVideoNoteCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoNoteCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionVideoNoteFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoNoteFree(name)\r\n }\r\n\r\n // sticker\r\n\r\n public validateSessionStickerFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodStickerFree(name)\r\n }\r\n\r\n // location\r\n\r\n public validateSessionLocationFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodLocationFree(name)\r\n }\r\n\r\n // contact\r\n\r\n public validateSessionContactFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodContactFree(name)\r\n }\r\n\r\n // =============== session set\r\n // callback\r\n\r\n public sessionCallback(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodCallback(name), params)\r\n }\r\n\r\n public sessionCallbackPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodCallbackPayload(name), params)\r\n }\r\n\r\n // text\r\n\r\n public sessionText(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodText(name), params)\r\n }\r\n\r\n public sessionTextPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodTextPayload(name), params)\r\n }\r\n\r\n public sessionTextCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodTextCommand(name), params)\r\n }\r\n\r\n public sessionTextCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodTextCommandPayload(name), params)\r\n }\r\n\r\n public sessionTextFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodTextFree(name), params)\r\n }\r\n\r\n // photo\r\n\r\n public sessionPhotoCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodPhotoCaption(name), params)\r\n }\r\n\r\n public sessionPhotoCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodPhotoCaptionPayload(name), params)\r\n }\r\n\r\n public sessionPhotoCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodPhotoCaptionCommand(name), params)\r\n }\r\n\r\n public sessionPhotoCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodPhotoCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionPhotoFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodPhotoFree(name), params)\r\n }\r\n\r\n // video\r\n\r\n public sessionVideoCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoCaption(name), params)\r\n }\r\n\r\n public sessionVideoCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoCaptionPayload(name), params)\r\n }\r\n\r\n public sessionVideoCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoCaptionCommand(name), params)\r\n }\r\n\r\n public sessionVideoCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionVideoFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoFree(name), params)\r\n }\r\n\r\n // audio\r\n\r\n public sessionAudioCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAudioCaption(name), params)\r\n }\r\n\r\n public sessionAudioCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAudioCaptionPayload(name), params)\r\n }\r\n\r\n public sessionAudioCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAudioCaptionCommand(name), params)\r\n }\r\n\r\n public sessionAudioCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAudioCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionAudioFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAudioFree(name), params)\r\n }\r\n\r\n // document\r\n\r\n public sessionDocumentCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodDocumentCaption(name), params)\r\n }\r\n\r\n public sessionDocumentCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodDocumentCaptionPayload(name), params)\r\n }\r\n\r\n public sessionDocumentCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodDocumentCaptionCommand(name), params)\r\n }\r\n\r\n public sessionDocumentCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodDocumentCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionDocumentFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodDocumentFree(name), params)\r\n }\r\n\r\n // animation\r\n\r\n public sessionAnimationCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAnimationCaption(name), params)\r\n }\r\n\r\n public sessionAnimationCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAnimationCaptionPayload(name), params)\r\n }\r\n\r\n public sessionAnimationCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAnimationCaptionCommand(name), params)\r\n }\r\n\r\n public sessionAnimationCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAnimationCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionAnimationFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAnimationFree(name), params)\r\n }\r\n\r\n // voice\r\n\r\n public sessionVoiceCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVoiceCaption(name), params)\r\n }\r\n\r\n public sessionVoiceCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVoiceCaptionPayload(name), params)\r\n }\r\n\r\n public sessionVoiceCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVoiceCaptionCommand(name), params)\r\n }\r\n\r\n public sessionVoiceCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVoiceCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionVoiceFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVoiceFree(name), params)\r\n }\r\n\r\n // video note\r\n\r\n public sessionVideoNoteCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoNoteCaption(name), params)\r\n }\r\n\r\n public sessionVideoNoteCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoNoteCaptionPayload(name), params)\r\n }\r\n\r\n public sessionVideoNoteCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoNoteCaptionCommand(name), params)\r\n }\r\n\r\n public sessionVideoNoteCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoNoteCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionVideoNoteFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoNoteFree(name), params)\r\n }\r\n\r\n // sticker\r\n\r\n public sessionStickerFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodStickerFree(name), params)\r\n }\r\n\r\n // location\r\n\r\n public sessionLocationFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodLocationFree(name), params)\r\n }\r\n\r\n // contact\r\n\r\n public sessionContactFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodContactFree(name), params)\r\n }\r\n\r\n // =============== session update to set\r\n // callback\r\n\r\n public sessionToCallback(paramsAdd?: any, name?: string) {\r\n return this.sessionCallback({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToCallbackPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionCallbackPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // text\r\n\r\n public sessionToText(paramsAdd?: any, name?: string) {\r\n return this.sessionText({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToTextPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionTextPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToTextCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionTextCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToTextCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionTextCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToTextFree(paramsAdd?: any, name?: string) {\r\n return this.sessionTextFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // photo\r\n\r\n public sessionToPhotoCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionPhotoCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToPhotoCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionPhotoCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToPhotoCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionPhotoCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToPhotoCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionPhotoCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToPhotoFree(paramsAdd?: any, name?: string) {\r\n return this.sessionPhotoFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // video\r\n\r\n public sessionToVideoCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoFree(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // audio\r\n\r\n public sessionToAudioCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionAudioCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAudioCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionAudioCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAudioCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionAudioCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAudioCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionAudioCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAudioFree(paramsAdd?: any, name?: string) {\r\n return this.sessionAudioFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // document\r\n\r\n public sessionToDocumentCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionDocumentCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToDocumentCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionDocumentCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToDocumentCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionDocumentCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToDocumentCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionDocumentCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToDocumentFree(paramsAdd?: any, name?: string) {\r\n return this.sessionDocumentFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // animation\r\n\r\n public sessionToAnimationCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionAnimationCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAnimationCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionAnimationCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAnimationCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionAnimationCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAnimationCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionAnimationCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAnimationFree(paramsAdd?: any, name?: string) {\r\n return this.sessionAnimationFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // voice\r\n\r\n public sessionToVoiceCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionVoiceCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVoiceCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVoiceCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVoiceCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionVoiceCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVoiceCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVoiceCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVoiceFree(paramsAdd?: any, name?: string) {\r\n return this.sessionVoiceFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // videonote\r\n\r\n public sessionToVideoNoteCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoNoteCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoNoteCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoNoteCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoNoteCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoNoteCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoNoteCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoNoteCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoNoteFree(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoNoteFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // sticker\r\n\r\n public sessionToStickerFree(paramsAdd?: any, name?: string) {\r\n return this.sessionStickerFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // location\r\n\r\n public sessionToLocationFree(paramsAdd?: any, name?: string) {\r\n return this.sessionLocationFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // contact\r\n\r\n public sessionToContactFree(paramsAdd?: any, name?: string) {\r\n return this.sessionContactFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // =============== build intent\r\n\r\n public buildIntent(str?: string, fbCallbackData = true) {\r\n if (!str) {\r\n str = fbCallbackData ? this.data.callbackData() : this.data.name\r\n }\r\n\r\n const tag = fbCallbackData ? `:` : ` `\r\n return str?.indexOf?.(tag) != -1 ? (str?.split?.(tag)?.[0] as string) : str\r\n }\r\n\r\n // =============== build session method\r\n\r\n public buildSessionMethod(prefix: string, name: string | undefined) {\r\n return `${prefix}-${name || this.data.name}`\r\n }\r\n\r\n // callback method\r\n\r\n public buildSessionMethodCallback(name?: string) {\r\n return this.buildSessionMethod(`1`, name)\r\n }\r\n\r\n public buildSessionMethodCallbackPayload(name?: string) {\r\n return this.buildSessionMethod(`2`, name)\r\n }\r\n\r\n // text method\r\n\r\n public buildSessionMethodText(name?: string) {\r\n return this.buildSessionMethod(`3`, name)\r\n }\r\n\r\n public buildSessionMethodTextPayload(name?: string) {\r\n return this.buildSessionMethod(`4`, name)\r\n }\r\n\r\n public buildSessionMethodTextCommand(name?: string) {\r\n return this.buildSessionMethod(`5`, name)\r\n }\r\n\r\n public buildSessionMethodTextCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`6`, name)\r\n }\r\n\r\n public buildSessionMethodTextFree(name?: string) {\r\n return this.buildSessionMethod(`7`, name)\r\n }\r\n\r\n // photo method\r\n\r\n public buildSessionMethodPhotoCaption(name?: string) {\r\n return this.buildSessionMethod(`8`, name)\r\n }\r\n\r\n public buildSessionMethodPhotoCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`9`, name)\r\n }\r\n\r\n public buildSessionMethodPhotoCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`10`, name)\r\n }\r\n\r\n public buildSessionMethodPhotoCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`11`, name)\r\n }\r\n\r\n public buildSessionMethodPhotoFree(name?: string) {\r\n return this.buildSessionMethod(`12`, name)\r\n }\r\n\r\n // video method\r\n\r\n public buildSessionMethodVideoCaption(name?: string) {\r\n return this.buildSessionMethod(`13`, name)\r\n }\r\n\r\n public buildSessionMethodVideoCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`14`, name)\r\n }\r\n\r\n public buildSessionMethodVideoCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`15`, name)\r\n }\r\n\r\n public buildSessionMethodVideoCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`16`, name)\r\n }\r\n\r\n public buildSessionMethodVideoFree(name?: string) {\r\n return this.buildSessionMethod(`17`, name)\r\n }\r\n\r\n // audio method\r\n\r\n public buildSessionMethodAudioCaption(name?: string) {\r\n return this.buildSessionMethod(`18`, name)\r\n }\r\n\r\n public buildSessionMethodAudioCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`19`, name)\r\n }\r\n\r\n public buildSessionMethodAudioCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`20`, name)\r\n }\r\n\r\n public buildSessionMethodAudioCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`21`, name)\r\n }\r\n\r\n public buildSessionMethodAudioFree(name?: string) {\r\n return this.buildSessionMethod(`22`, name)\r\n }\r\n\r\n // document method\r\n\r\n public buildSessionMethodDocumentCaption(name?: string) {\r\n return this.buildSessionMethod(`23`, name)\r\n }\r\n\r\n public buildSessionMethodDocumentCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`24`, name)\r\n }\r\n\r\n public buildSessionMethodDocumentCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`25`, name)\r\n }\r\n\r\n public buildSessionMethodDocumentCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`26`, name)\r\n }\r\n\r\n public buildSessionMethodDocumentFree(name?: string) {\r\n return this.buildSessionMethod(`27`, name)\r\n }\r\n\r\n // animation method\r\n\r\n public buildSessionMethodAnimationCaption(name?: string) {\r\n return this.buildSessionMethod(`28`, name)\r\n }\r\n public buildSessionMethodAnimationCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`29`, name)\r\n }\r\n public buildSessionMethodAnimationCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`30`, name)\r\n }\r\n public buildSessionMethodAnimationCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`31`, name)\r\n }\r\n public buildSessionMethodAnimationFree(name?: string) {\r\n return this.buildSessionMethod(`32`, name)\r\n }\r\n\r\n // voice method\r\n\r\n public buildSessionMethodVoiceCaption(name?: string) {\r\n return this.buildSessionMethod(`33`, name)\r\n }\r\n public buildSessionMethodVoiceCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`34`, name)\r\n }\r\n public buildSessionMethodVoiceCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`35`, name)\r\n }\r\n public buildSessionMethodVoiceCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`36`, name)\r\n }\r\n public buildSessionMethodVoiceFree(name?: string) {\r\n return this.buildSessionMethod(`37`, name)\r\n }\r\n\r\n // video note method\r\n public buildSessionMethodVideoNoteCaption(name?: string) {\r\n return this.buildSessionMethod(`38`, name)\r\n }\r\n public buildSessionMethodVideoNoteCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`39`, name)\r\n }\r\n public buildSessionMethodVideoNoteCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`40`, name)\r\n }\r\n public buildSessionMethodVideoNoteCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`41`, name)\r\n }\r\n public buildSessionMethodVideoNoteFree(name?: string) {\r\n return this.buildSessionMethod(`42`, name)\r\n }\r\n public buildSessionMethodStickerFree(name?: string) {\r\n return this.buildSessionMethod(`43`, name) // sticker method\r\n }\r\n public buildSessionMethodLocationFree(name?: string) {\r\n return this.buildSessionMethod(`44`, name) // location method\r\n }\r\n public buildSessionMethodContactFree(name?: string) {\r\n return this.buildSessionMethod(`45`, name) // contact method\r\n }\r\n}\r\n","import { Ctx } from \"./ctx\"\r\nimport { serve } from \"bun\"\r\nimport { join, parse } from \"node:path\"\r\nimport { CacheExternal } from \"../cache\"\r\nimport { LoggingPretty } from \"logging-pretty\"\r\nimport { TemplateManager } from \"../template\"\r\nimport { existsSync, readdirSync } from \"node:fs\"\r\nimport { Bot, webhookCallback, type BotError, type Context } from \"grammy\"\r\nimport type { UserFromGetMe } from \"grammy/types\"\r\n\r\nexport class Gramstax {\r\n public templateManager: TemplateManager\r\n public cacheKeyboard: Map<any, any>\r\n public cacheSession: CacheExternal\r\n public pages: ReturnType<typeof this.pageLoads>\r\n public log: LoggingPretty | undefined | null\r\n public bot: Bot\r\n\r\n public constructor(params: { token: string; deploy: string; log?: LoggingPretty; cacheSession?: CacheExternal; cacheKeyboard?: Map<any, any>; templateManager?: TemplateManager }) {\r\n this.log = params.log === null ? undefined : params.log === undefined ? new LoggingPretty() : params.log\r\n this.cacheSession = params.cacheSession || new CacheExternal(`memory`, `session`)\r\n this.cacheKeyboard = params.cacheKeyboard || new Map()\r\n this.templateManager = params.templateManager || new TemplateManager({ path: null })\r\n\r\n this.bot = new Bot(params.token)\r\n this.bot.catch(this.onCatch)\r\n this.bot.on(`callback_query:data`, this.onCallbackQueryData.bind(this)) // Handle callback queries from inline keyboards\r\n this.bot.on(`message:text`, this.onMessageText.bind(this)) // Handle global text messages\r\n this.bot.on(`message:photo`, this.onMessagePhoto.bind(this)) // Handle global photo messages\r\n this.bot.on(`message:video`, this.onMessageVideo.bind(this)) // Handle global video messages\r\n this.bot.on(`message:audio`, this.onMessageAudio.bind(this)) // Handle global audio messages\r\n this.bot.on(`message:document`, this.onMessageDocument.bind(this)) // Handle global document messages\r\n this.bot.on(`message:animation`, this.onMessageAnimation.bind(this)) // Handle global animation messages\r\n this.bot.on(`message:voice`, this.onMessageVoice.bind(this)) // Handle global voice messages\r\n this.bot.on(`message:video_note`, this.onMessageVideoNote.bind(this)) // Handle global video note messages\r\n this.bot.on(`message:sticker`, this.onMessageSticker.bind(this)) // Handle global sticker messages\r\n this.bot.on(`message:location`, this.onMessageLocation.bind(this)) // Handle global location messages\r\n this.bot.on(`message:contact`, this.onMessageContact.bind(this)) // Handle global contact messages\r\n\r\n // Load pages AFTER templateManager is initialized\r\n this.pages = this.pageLoads()\r\n\r\n // Graceful shutdown\r\n process.once(`SIGINT`, () => this.bot.stop())\r\n process.once(`SIGTERM`, () => this.bot.stop())\r\n\r\n if (params.deploy.startsWith(`polling`)) {\r\n this.runPolling()\r\n } else if (params.deploy.startsWith(`webhook`)) {\r\n this.runWebhook(params.deploy.split(`webhook:`)[1] as string)\r\n }\r\n }\r\n\r\n public onCatch(error: BotError<Context>) {\r\n this.log?.error?.(`[Bot.catch]: ${String(error)}`)\r\n }\r\n\r\n public onStart(botInfo: UserFromGetMe, method: `polling` | `webhook`, data: string | null) {\r\n const { username } = botInfo\r\n if (method == `polling`) {\r\n this.log?.success?.(`Telegram bot polling started: ${username}`)\r\n } else {\r\n this.log?.success?.(`Telegram bot webhook started: ${username} (${data})`)\r\n }\r\n }\r\n\r\n public initCtx(ct: Context) {\r\n return new Ctx({\r\n ct,\r\n cacheSession: this.cacheSession,\r\n cacheKeyboard: this.cacheKeyboard,\r\n templateManager: this.templateManager,\r\n temp: {\r\n session: {},\r\n data: {}\r\n }\r\n })\r\n }\r\n\r\n public async runPolling() {\r\n this.bot.start({\r\n onStart: async (botInfo) => {\r\n this.onStart(botInfo, `polling`, null)\r\n }\r\n })\r\n }\r\n\r\n public async runWebhook(baseUrl: string) {\r\n const handleUpdate = webhookCallback(this.bot, `bun`)\r\n const pathWebhook = `/telegram-webhook`\r\n serve({\r\n fetch(req) {\r\n const { pathname } = new URL(req.url)\r\n if (pathname === pathWebhook) {\r\n if (req.method === `POST`) {\r\n return handleUpdate(req as any)\r\n }\r\n return new Response(`OK`, { status: 200 })\r\n }\r\n\r\n if (pathname === `/` && req.method === `GET`) {\r\n const timestamp = new Date().toISOString()\r\n return new Response(JSON.stringify({ timestamp }), {\r\n status: 200,\r\n headers: { \"Content-Type\": `application/json` }\r\n })\r\n }\r\n\r\n // Jika tidak cocok\r\n return new Response(`Not found`, { status: 404 })\r\n }\r\n })\r\n\r\n const data = await this.bot.api.getWebhookInfo()\r\n const webhookUrl = baseUrl.endsWith(`/`) ? baseUrl.slice(0, -1) + pathWebhook : baseUrl + pathWebhook\r\n if (data.url != webhookUrl) {\r\n await this.bot.api.setWebhook(webhookUrl)\r\n }\r\n\r\n const botInfo = await this.bot.api.getMe()\r\n this.onStart(botInfo, `webhook`, webhookUrl)\r\n }\r\n\r\n public pageCompile(Page: typeof Ctx, redacted = true) {\r\n if (Page?.template !== undefined) {\r\n this.templateManager.compile(Page.data.name, Page.template)\r\n if (redacted) {\r\n Page.template = undefined // redacted to reduce memory\r\n }\r\n } else {\r\n Page.template = undefined\r\n }\r\n }\r\n\r\n public pageBuildData(Page: typeof Ctx, filePath: string) {\r\n if (Page?.data === undefined) {\r\n Page.data = Page.buildData()\r\n }\r\n Page.data.name = parse(filePath).name\r\n }\r\n\r\n public pageSorts(Page: typeof Ctx, pages: typeof this.pages) {\r\n const name = Page.data.name\r\n const proto = Page.prototype\r\n\r\n const partPayload = `Payload`\r\n const partCommand = `Command`\r\n const partCaption = `Caption`\r\n const partFree = `Free`\r\n\r\n const pd = pages.dynamic\r\n const pds = pages.dynamicSpesific\r\n\r\n const upFirst = (s: string) => s.charAt(0).toUpperCase() + s.slice(1)\r\n const getPureFuncName = (func: string) => func.replace(partPayload, ``).replace(partCommand, ``).replace(partCaption, ``).replace(partFree, ``)\r\n const buildSessionMethod = (func: string, name: any) => (proto as any)[`buildSessionMethod${upFirst(func)}`](name)\r\n\r\n // all\r\n pages.all[name] = Page\r\n\r\n for (let index = 0; index < pages.lenListFuncStaticSession; index++) {\r\n const func = pages.listFuncStaticSession[index] as string\r\n\r\n const ps = pages.static[func as keyof typeof pages.static]\r\n const psi = pages.staticIntent[func as keyof typeof pages.staticIntent]\r\n const pss = pages.staticSession[func as keyof typeof pages.staticSession]\r\n\r\n const value = { name, func } as any\r\n const p = ps || psi\r\n if (p !== undefined) {\r\n const _name = func.includes(partCommand) ? `/${name}` : name\r\n p[proto.buildIntent(_name, func.startsWith(`callback`))] = value\r\n }\r\n\r\n // staticSession\r\n if (pss !== undefined) {\r\n pss[buildSessionMethod(func, name)] = value\r\n }\r\n\r\n // dynamicStatic\r\n if (func.toLowerCase().endsWith(`free`)) {\r\n pds[getPureFuncName(func) as keyof typeof pds].push(value)\r\n }\r\n }\r\n\r\n // all\r\n if (proto.free) {\r\n pd.push(name)\r\n }\r\n }\r\n\r\n public pageLoads() {\r\n this.log?.info?.(`Load pages..`)\r\n\r\n const path = join(process.cwd(), `src`, `pages`)\r\n if (!existsSync(path)) {\r\n throw new Error(`Folder ${path} is not found, please make it manually`)\r\n }\r\n\r\n const files = readdirSync(path)\r\n const initStatic = {} as Record<string, { name: string; func: string }> // { [page.data.name]: { name: Page.data.name, func: routeFunctionName } }\r\n const initStaticIntent = initStatic // { [intent]: { name: page.data.name, func: routeFunctionName } }\r\n const initStaticSession = initStatic // { [session.method]: { name: page.data.name, func: routeFunctionName } }\r\n const initDynamicSpesific = [] as { name: string; func: string }[] //\r\n\r\n const listFuncStatic = [\r\n // callback\r\n `callback`,\r\n // text\r\n `text`,\r\n `textCommand`,\r\n // photo\r\n `photoCaption`,\r\n `photoCaptionCommand`,\r\n // video\r\n `videoCaption`,\r\n `videoCaptionCommand`,\r\n // audio\r\n `audioCaption`,\r\n `audioCaptionCommand`,\r\n // document\r\n `documentCaption`,\r\n `documentCaptionCommand`,\r\n // animation\r\n `animationCaption`,\r\n `animationCaptionCommand`,\r\n // voice\r\n `voiceCaption`,\r\n `voiceCaptionCommand`,\r\n // videoNote\r\n `videoNoteCaption`,\r\n `videoNoteCaptionCommand`\r\n ] as const\r\n const listFuncStaticIntent = [\r\n // callback\r\n `callbackPayload`,\r\n // text\r\n `textPayload`,\r\n `textCommandPayload`,\r\n // photo\r\n `photoCaptionPayload`,\r\n `photoCaptionCommandPayload`,\r\n // video\r\n `videoCaptionPayload`,\r\n `videoCaptionCommandPayload`,\r\n // audio\r\n `audioCaptionPayload`,\r\n `audioCaptionCommandPayload`,\r\n // document\r\n `documentCaptionPayload`,\r\n `documentCaptionCommandPayload`,\r\n // animation\r\n `animationCaptionPayload`,\r\n `animationCaptionCommandPayload`,\r\n // voice\r\n `voiceCaptionPayload`,\r\n `voiceCaptionCommandPayload`,\r\n // video note\r\n `videoNoteCaptionPayload`,\r\n `videoNoteCaptionCommandPayload`\r\n ] as const\r\n const listFuncStaticSession = [\r\n ...listFuncStatic,\r\n ...listFuncStaticIntent,\r\n // text\r\n `textFree`,\r\n // photo\r\n `photoFree`,\r\n // video\r\n `videoFree`,\r\n // audio\r\n `audioFree`,\r\n // document\r\n `documentFree`,\r\n // animation\r\n `animationFree`,\r\n // voice\r\n `voiceFree`,\r\n // videoNote\r\n `videoNoteFree`,\r\n // sticker\r\n `stickerFree`,\r\n // location\r\n `locationFree`,\r\n // contact\r\n `contactFree`\r\n ] as const\r\n\r\n const makeObject = <const T extends readonly string[], V>(keys: T, val: V): { [K in T[number]]: V } => Object.fromEntries(keys.map((k) => [k, { ...val }])) as { [K in T[number]]: V }\r\n\r\n const pages = {\r\n all: {} as Record<string, typeof Ctx>, // (classes) all Page\r\n dynamic: [] as string[], // (dynamic) all Page function free\r\n dynamicSpesific: {\r\n text: initDynamicSpesific,\r\n photo: initDynamicSpesific,\r\n video: initDynamicSpesific,\r\n audio: initDynamicSpesific,\r\n document: initDynamicSpesific,\r\n animation: initDynamicSpesific,\r\n voice: initDynamicSpesific,\r\n videoNote: initDynamicSpesific,\r\n sticker: initDynamicSpesific,\r\n location: initDynamicSpesific,\r\n contact: initDynamicSpesific\r\n },\r\n static: makeObject(listFuncStatic, initStatic),\r\n staticIntent: makeObject(listFuncStaticIntent, initStaticIntent),\r\n staticSession: makeObject(listFuncStaticSession, initStaticSession),\r\n listFuncStatic,\r\n listFuncStaticIntent,\r\n listFuncStaticSession,\r\n lenListFuncStatic: listFuncStatic.length,\r\n lenListFuncStaticIntent: listFuncStaticIntent.length,\r\n lenListFuncStaticSession: listFuncStaticSession.length\r\n }\r\n\r\n for (const file of files) {\r\n const filePath = join(path, file)\r\n const module = require(filePath) // eslint-disable-line\r\n const exports = Object.values(module)\r\n const Page = exports[0] as typeof Ctx // like StartPage. not have default export\r\n if (Page === undefined) {\r\n throw `file ${parse(filePath).name} must have export (not default) class page`\r\n }\r\n\r\n // create if not exist and set name (without ext) according filePath\r\n this.pageBuildData(Page, filePath)\r\n\r\n // if the raw template writes directly to the Page class, do a compile\r\n this.pageCompile(Page)\r\n\r\n // sort route method\r\n this.pageSorts(Page, pages)\r\n }\r\n\r\n this.log?.info?.(`Finish load pages with total (${Object.keys(pages.all).length})`)\r\n return pages\r\n }\r\n\r\n public async pageRoutes(ctx: Ctx, fromListener: `callback` | keyof typeof this.pages.dynamicSpesific): Promise<any | null> {\r\n // to be reassigned\r\n let Page: typeof Ctx | undefined\r\n let res: { name: string; func: string } | undefined\r\n\r\n // (static) priority O(1)\r\n if (Page === undefined) {\r\n const cd = ctx.callbackData\r\n const mt = ctx.msgText\r\n const mc = ctx.msgCaption\r\n const ps = this.pages.static\r\n\r\n for (let index = 0; index < this.pages.lenListFuncStatic; index++) {\r\n const funcName = this.pages.listFuncStatic[index] as `animationCaption`\r\n res = ps[funcName][cd || mt || mc]\r\n if (res) {\r\n break\r\n }\r\n }\r\n\r\n if (res !== undefined) {\r\n Page = this.pages.all[res.name]\r\n }\r\n }\r\n\r\n // (staticSession) x = method; O(x)\r\n if (Page === undefined) {\r\n const session = await ctx.sessionGet()\r\n if (session) {\r\n const mtd = session.method\r\n const pss = this.pages.staticSession\r\n\r\n for (let index = 0; index < this.pages.lenListFuncStaticSession; index++) {\r\n const funcName = this.pages.listFuncStaticSession[index] as `animationCaption`\r\n res = pss[funcName][mtd]\r\n if (res) {\r\n break\r\n }\r\n }\r\n\r\n if (res !== undefined) {\r\n Page = this.pages.all[res.name]\r\n }\r\n }\r\n }\r\n\r\n // (staticIntent) x = startsWith; O(x)\r\n if (Page === undefined) {\r\n const cdi = ctx.callbackDataIntent\r\n const mti = ctx.msgTextIntent\r\n const mci = ctx.msgCaptionIntent\r\n const psi = this.pages.staticIntent\r\n\r\n for (let index = 0; index < this.pages.lenListFuncStaticIntent; index++) {\r\n const funcName = this.pages.listFuncStaticIntent[index] as `animationCaptionCommandPayload`\r\n res = psi[funcName][cdi || mti || mci]\r\n if (res) {\r\n break\r\n }\r\n }\r\n\r\n if (res !== undefined) {\r\n Page = this.pages.all[res.name]\r\n }\r\n }\r\n\r\n // run\r\n if (Page !== undefined && res !== undefined) {\r\n const initPage = new Page(ctx)\r\n const initRoute = await initPage[res.func as keyof typeof initPage]?.()\r\n return initRoute\r\n }\r\n\r\n // (dynamicSpesific) O(n)\r\n const arrFree = this.pages.dynamicSpesific[fromListener as keyof typeof this.pages.dynamicSpesific] || []\r\n for (let index = 0; index < arrFree.length; index++) {\r\n const value = arrFree[index]\r\n if (value === undefined) {\r\n continue\r\n }\r\n\r\n const Page = this.pages.all[value.func]\r\n if (Page === undefined) {\r\n continue\r\n }\r\n\r\n const initPage = new Page(ctx)\r\n const initRoute = await initPage[value.name as keyof typeof initPage]?.()\r\n // const initRoute = await initPage.route(value.name)\r\n if (initRoute !== null) {\r\n return initRoute // stop when return not null\r\n }\r\n }\r\n\r\n // (dynamic) O(n)\r\n for (let index = 0; index < this.pages.dynamic.length; index++) {\r\n const value = this.pages.dynamic[index]\r\n if (value === undefined) {\r\n continue\r\n }\r\n\r\n const Page = this.pages.all[value]\r\n if (Page === undefined) {\r\n continue\r\n }\r\n\r\n const initPage = new Page(ctx)\r\n const initRoute = await initPage.free?.()\r\n // const initRoute = await initPage.route(`free`)\r\n if (initRoute !== null) {\r\n return initRoute // stop when return not null\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n public async hookBeforeRoute(ctx: Ctx, listenerName: string) {\r\n // must be override\r\n return true\r\n }\r\n\r\n public async hookErrorPage(ctx: Ctx, listenerName: string, error: any, isEdit: boolean) {\r\n // must be override\r\n return\r\n }\r\n\r\n public async hookErrorInputNotFoundPage(ctx: Ctx) {\r\n // must be override\r\n return\r\n }\r\n\r\n public async onMessage(ct: Context, listenerName: string): Promise<void> {\r\n const ctx = this.initCtx(ct)\r\n try {\r\n const before = await this.hookBeforeRoute(ctx, listenerName)\r\n if (before === false) {\r\n return\r\n }\r\n\r\n const route = await this.pageRoutes(ctx, listenerName as any)\r\n if (route === null) {\r\n await this.hookErrorInputNotFoundPage(ctx)\r\n }\r\n } catch (error) {\r\n await this.hookErrorPage(ctx, listenerName, error, false)\r\n }\r\n }\r\n\r\n public async onCallbackQueryData(ct: Context): Promise<void> {\r\n const ctx = this.initCtx(ct)\r\n try {\r\n // answer callback query first for fast response\r\n await ctx.callbackQueryAnswer()\r\n const before = await this.hookBeforeRoute(ctx, `onCallbackQueryData`)\r\n if (before === false) {\r\n return\r\n }\r\n\r\n // Check all route\r\n await this.pageRoutes(ctx, `callback`)\r\n } catch (error) {\r\n await this.hookErrorPage(ctx, `onCallbackQueryData`, error, true)\r\n }\r\n }\r\n\r\n public async onMessageText(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageText`)\r\n }\r\n\r\n public async onMessagePhoto(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessagePhoto`)\r\n }\r\n\r\n public async onMessageVideo(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageVideo`)\r\n }\r\n\r\n public async onMessageAudio(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageAudio`)\r\n }\r\n\r\n public async onMessageDocument(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageDocument`)\r\n }\r\n\r\n public async onMessageAnimation(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageAnimation`)\r\n }\r\n\r\n public async onMessageVoice(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageVoice`)\r\n }\r\n\r\n public async onMessageVideoNote(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageVideoNote`)\r\n }\r\n\r\n public async onMessageSticker(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageSticker`)\r\n }\r\n\r\n public async onMessageLocation(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageLocation`)\r\n }\r\n\r\n public async onMessageContact(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageContact`)\r\n }\r\n}\r\n","export class TemplateEngine {\r\n public static _escape(str: string): string {\r\n return str\r\n .replace(/\\\\/g, `\\\\\\\\`) // escape backslash: \\ → \\\\\r\n .replace(/`/g, `\\\\\\``) // escape backtick: ` → \\`\r\n }\r\n\r\n public static _processVariables(template: string) {\r\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => `\\${(data && data[\"${key}\"]) ?? \"\"}`)\r\n }\r\n\r\n public static _processBaseBlocks(template: string) {\r\n const baseRegex = /<base\\b[^>]*?(?:\\sid=([\"']?)([^\"'\\s>]+)\\1)?[^>]*?>([\\s\\S]*?)<\\/base>/g\r\n const result: {\r\n [baseId: string]: string\r\n } = {}\r\n\r\n for (const match of template.matchAll(baseRegex)) {\r\n const idValue = match[2] ?? `default`\r\n const inner = match[3] ?? ``\r\n const cleaned = inner\r\n .replace(/^[\\t ]+/gm, ``)\r\n .replace(/^\\n+/, ``)\r\n .replace(/\\n+$/, ``)\r\n .trim()\r\n\r\n result[idValue] = cleaned\r\n }\r\n return result\r\n }\r\n\r\n public static _processScriptBlocks(template: string) {\r\n return template.replace(/<script\\b[^>]*>([\\s\\S]*?)<\\/script>/gi, (_, rawCode) => {\r\n const innerCode = rawCode.trim()\r\n if (!innerCode) return ``\r\n\r\n return `\\${(() => { if (!data) return ''; try { with(data) { ${innerCode} } } catch(e) { return '' } })()}`\r\n })\r\n }\r\n\r\n public static _processSpaceBlocks(template: string) {\r\n return template.replace(/^[ \\t]*<space\\s*\\/>[ \\t]*$/gim, ``)\r\n }\r\n\r\n public static _processDivBlocks(template: string) {\r\n return template.replace(/<div>([\\s\\S]*?)<\\/div>/gi, (_, inner) => {\r\n const cleaned = inner\r\n .replace(/^[\\t ]+/gm, ``)\r\n .replace(/^\\n+/, ``)\r\n .replace(/\\n+$/, ``)\r\n return cleaned\r\n })\r\n }\r\n\r\n public static _processMessageBlocks(template: string) {\r\n const messageRegex = /<message\\s+lang=\"([^\"]+)\"\\s*>([\\s\\S]*?)<\\/message>/gi\r\n const result: {\r\n [lang: string]: string\r\n } = {}\r\n\r\n for (const [, lang, rawContent] of template.matchAll(messageRegex) as any) {\r\n const cleaned = rawContent\r\n .replace(/^[\\t ]+/gm, ``)\r\n .replace(/^\\n+/, ``)\r\n .replace(/\\n+$/, ``)\r\n .trim()\r\n\r\n result[lang] = cleaned\r\n }\r\n return result\r\n }\r\n\r\n public static _processKeyboardBlocks(template: string) {\r\n const keyboardRegex = /<keyboard\\b[^>]*\\blang=\"([^\"]*)\"[^>]*?(?:\\sfor=\"([^\"]*)\")?[^>]*>([\\s\\S]*?)<\\/keyboard>/gi\r\n const result: {\r\n [lang: string]: {\r\n inline?: string\r\n default?: string\r\n }\r\n } = {}\r\n\r\n for (const [, lang, forAttr, rawContent] of template.matchAll(keyboardRegex) as any) {\r\n const mode = forAttr === `default` ? `default` : `inline`\r\n const cleaned = rawContent.trim()\r\n\r\n if (!result[lang]) {\r\n result[lang] = {}\r\n }\r\n result[lang][mode] = cleaned\r\n }\r\n return result\r\n }\r\n\r\n public static _compileToFunction<T extends boolean>(template: T extends true ? string[] : string, isArray: T): T extends true ? (data?: Record<string, any>) => string[] : (data?: Record<string, any>) => string {\r\n let singleOrCombined: string\r\n if (isArray) {\r\n const multiTemplate = template as string[]\r\n singleOrCombined = multiTemplate.map((t) => `\\`${t}\\``).join(`,`)\r\n } else {\r\n singleOrCombined = `\\`${template as string}\\``\r\n }\r\n\r\n let processed = singleOrCombined\r\n processed = this._processScriptBlocks(this._processDivBlocks(this._processSpaceBlocks(processed)))\r\n\r\n if (isArray) {\r\n const functionBody = `return [${processed}]`\r\n return new Function(`data`, functionBody) as any\r\n } else {\r\n const functionBody = `return ${processed}`\r\n return new Function(`data`, functionBody) as any\r\n }\r\n }\r\n\r\n public static compileMessages(template: string) {\r\n const baseBlocks = this._processBaseBlocks(template)\r\n const result: {\r\n [baseId: string]: {\r\n [lang: string]: (data?: Record<string, any>) => string\r\n }\r\n } = {}\r\n\r\n for (const [baseId, baseContent] of Object.entries(baseBlocks)) {\r\n const messages = this._processMessageBlocks(baseContent)\r\n result[baseId] = {}\r\n\r\n for (const [lang, content] of Object.entries(messages)) {\r\n const processed = this._processVariables(this._processScriptBlocks(content))\r\n result[baseId][lang] = this._compileToFunction(processed, false)\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n public static compileKeyboards(template: string) {\r\n const baseBlocks = this._processBaseBlocks(template)\r\n const result: {\r\n [baseId: string]: {\r\n [lang: string]: {\r\n inline?: (data?: Record<string, any>) => string[]\r\n default?: (data?: Record<string, any>) => string[]\r\n }\r\n }\r\n } = {}\r\n\r\n for (const [baseId, baseContent] of Object.entries(baseBlocks)) {\r\n const keyboards = this._processKeyboardBlocks(baseContent)\r\n result[baseId] = {}\r\n\r\n for (const [lang, modes] of Object.entries(keyboards)) {\r\n result[baseId][lang] = {}\r\n\r\n for (const [mode, content] of Object.entries(modes)) {\r\n // Pisahkan label, handle escaped comma\r\n const labels = content.split(/(?<!\\\\),\\s*/).map((label: string) => label.replace(/\\\\,/g, `,`).trim())\r\n\r\n const processedLabels = labels.map((label) => this._processVariables(this._processScriptBlocks(label)))\r\n\r\n result[baseId][lang][mode as `inline` | `default`] = this._compileToFunction(processedLabels, true)\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }\r\n}\r\n","import { TemplateEngine } from \".\"\r\nimport { readFile, mkdir } from \"node:fs/promises\"\r\nimport { watch, FSWatcher } from \"chokidar\"\r\nimport { basename, join, extname } from \"node:path\"\r\nimport { readdirSync, readFileSync, existsSync, statSync, writeFileSync } from \"node:fs\"\r\n\r\n/** Template file interface for better type safety */\r\ntype ICompiledTemplate = {\r\n message: ReturnType<typeof TemplateEngine.compileMessages>\r\n keyboard: ReturnType<typeof TemplateEngine.compileKeyboards>\r\n}\r\n\r\n/** Template loading options */\r\ntype ITemplateOptions = {\r\n /** Enable file watching for hot reloading (if have templatePath) */\r\n enableWatch?: boolean\r\n /** Base path for template files (set null if dont want read template from file) */\r\n path?: string | undefined | null\r\n /** Force language params to this value */\r\n forceLanguage?: string | undefined | null\r\n}\r\n\r\n/** Template management system */\r\nexport class TemplateManager {\r\n public _map = new Map<string, ICompiledTemplate>()\r\n public _engine = TemplateEngine\r\n public _watcher: FSWatcher | null = null\r\n public _supportedExtensions = new Set([`.html`])\r\n public readonly _path: string | null\r\n public readonly _forceLanguage: string | null\r\n public readonly _isWatchEnabled: boolean\r\n public constructor(options: ITemplateOptions = {}) {\r\n const { enableWatch = false, path = null, forceLanguage = null } = options\r\n\r\n this._path = path\r\n this._forceLanguage = forceLanguage\r\n this._isWatchEnabled = enableWatch\r\n\r\n this._validatePath()\r\n this._initializeWatcher()\r\n this._loadAllFiles()\r\n }\r\n\r\n /** Validate and ensure template directory exists. @returns Void */\r\n public _validatePath(): void {\r\n try {\r\n if (this._path === null || !existsSync(this._path)) {\r\n return\r\n }\r\n\r\n const stats = statSync(this._path)\r\n if (!stats.isDirectory()) {\r\n throw new Error(`Template path is not a directory: ${this._path}`)\r\n }\r\n } catch (error) {\r\n throw new Error(`Failed to validate Template path: ${error}`)\r\n }\r\n }\r\n\r\n /** Initialize file system watcher for hot reloading. @returns Void */\r\n public _initializeWatcher(): void {\r\n if (this._path === null || !this._isWatchEnabled) {\r\n return\r\n }\r\n\r\n this._watcher = watch(this._path, {\r\n persistent: true,\r\n ignoreInitial: true,\r\n awaitWriteFinish: {\r\n stabilityThreshold: 100,\r\n pollInterval: 50\r\n }\r\n })\r\n\r\n this._watcher!.on(`change`, this._handleFileChange.bind(this))\r\n this._watcher!.on(`add`, this._handleFileAdd.bind(this))\r\n this._watcher!.on(`unlink`, this._handleFileDelete.bind(this))\r\n this._watcher!.on(`error`, this._handleWatchError.bind(this))\r\n }\r\n\r\n /** Handle file change events */\r\n public async _handleFileChange(filepath: string): Promise<void> {\r\n const filename = basename(filepath)\r\n if (this._isValidFile(filename)) {\r\n await this._loadFile(filename, false)\r\n }\r\n }\r\n\r\n /** Handle file add events */\r\n public async _handleFileAdd(filePath: string): Promise<void> {\r\n const fileName = basename(filePath)\r\n if (this._isValidFile(fileName)) {\r\n await this._loadFile(fileName, false)\r\n }\r\n }\r\n\r\n /** Handle file delete events */\r\n public _handleFileDelete(filePath: string): void {\r\n const fileName = basename(filePath)\r\n const fileKey = this._getKey(fileName)\r\n if (this._map.has(fileKey)) {\r\n this._map.delete(fileKey)\r\n }\r\n }\r\n\r\n /** Handle watcher errors */\r\n public _handleWatchError(error: any): void {\r\n // you can overrides\r\n }\r\n\r\n /** Load all Template files during initialization */\r\n public _loadAllFiles(): void {\r\n if (this._path === null || !existsSync(this._path)) {\r\n return\r\n }\r\n const files = readdirSync(this._path, { encoding: `utf8` })\r\n const validFiles = files.filter((file) => this._isValidFile(file))\r\n for (const fileName of validFiles) {\r\n this._loadFile(fileName, true)\r\n }\r\n }\r\n\r\n /** Load and compile a single template file */\r\n public async _loadFile(filename: string, useSync: boolean = true): Promise<void> {\r\n if (this._path === null) {\r\n return\r\n }\r\n const path = join(this._path, filename)\r\n const key = this._getKey(filename)\r\n const raw = useSync ? readFileSync(path, { encoding: `utf8` }) : await readFile(path, { encoding: `utf8` })\r\n this.compile(key, raw)\r\n }\r\n\r\n public _isValidFile(filename: string): boolean {\r\n const extension = extname(filename).toLowerCase()\r\n return this._supportedExtensions.has(extension)\r\n }\r\n\r\n public _getKey(filename: string): string {\r\n return filename.replace(/\\.[^/.]+$/, ``)\r\n }\r\n\r\n public compile(key: string, rawTemplate: string, keepIfExist?: Partial<{ [K in keyof ICompiledTemplate]: boolean }>) {\r\n const existing = this._map.get(key)\r\n const compiled = existing || ({} as ICompiledTemplate)\r\n let updated = false\r\n\r\n if (keepIfExist === undefined || keepIfExist?.message === false || existing?.message === undefined) {\r\n compiled.message = TemplateEngine.compileMessages(rawTemplate)\r\n updated = true\r\n }\r\n if (keepIfExist === undefined || keepIfExist?.keyboard === false || existing?.keyboard === undefined) {\r\n compiled.keyboard = TemplateEngine.compileKeyboards(rawTemplate)\r\n updated = true\r\n }\r\n\r\n if (updated) {\r\n this._map.set(key, compiled)\r\n }\r\n }\r\n\r\n /**\r\n * Get compiled message template\r\n * @param key Template identifier (filename without extension)\r\n * @param baseId Base id attr from block\r\n * @param language Target language code\r\n * @param data Template variables\r\n * @returns Rendered message string\r\n */\r\n public getMessage(key: string, baseId: string = `default`, language: string = `en`, data?: Record<string, any>): string {\r\n const template = this._map.get(key)\r\n const func = template?.message?.[baseId]?.[this._forceLanguage || language]\r\n if (!func) {\r\n return ``\r\n }\r\n\r\n try {\r\n return func(data)\r\n } catch (error) {\r\n return ``\r\n }\r\n }\r\n\r\n /**\r\n * Get compiled keyboard template\r\n * @param key Template identifier (filename without extension)\r\n * @param baseId Base id attr from block\r\n * @param language Target language code\r\n * @param data Template variables\r\n * @returns Array of rendered button labels\r\n */\r\n public getKeyboard(key: string, baseId: string = `default`, language: string = `en`, display: `inline` | `default` = `inline`, data?: Record<string, any>): string[] {\r\n const template = this._map.get(key)\r\n const func = template?.keyboard?.[baseId]?.[this._forceLanguage || language]?.[display]\r\n if (!func) {\r\n return []\r\n }\r\n\r\n try {\r\n return func(data)\r\n } catch (error) {\r\n return []\r\n }\r\n }\r\n\r\n /**\r\n * Update message template in memory\r\n * @param key Template identifier (filename without extension)\r\n * @param rawTemplate Raw template string\r\n */\r\n public setMessage(key: string, rawTemplate: string): void {\r\n this.compile(key, rawTemplate, { keyboard: true })\r\n }\r\n\r\n /**\r\n * Update keyboard template in memory\r\n * @param key Template identifier (filename without extension)\r\n * @param rawTemplate Raw template string\r\n */\r\n public setKeyboard(key: string, rawTemplate: string): void {\r\n this.compile(key, rawTemplate, { message: true })\r\n }\r\n\r\n /**\r\n * Write template to file and update cache\r\n * @param filename Target filename (with extension)\r\n * @param rawTemplate Template to write\r\n * @returns Promise that resolves when file is written\r\n */\r\n public async write(filename: string, rawTemplate: string): Promise<void> {\r\n if (this._path === null) {\r\n return\r\n }\r\n const filePath = join(this._path, filename)\r\n await mkdir(this._path, { recursive: true })\r\n writeFileSync(filePath, rawTemplate, { encoding: `utf8` })\r\n await this._loadFile(filename, false)\r\n }\r\n\r\n /**\r\n * Get list of available template\r\n * @returns Array of template names\r\n */\r\n public getAvailable(): string[] {\r\n return Array.from(this._map.keys())\r\n }\r\n\r\n /**\r\n * Check if template exists\r\n * @param key Template identifier\r\n * @returns True if template exists\r\n */\r\n public has(key: string): boolean {\r\n return this._map.has(key)\r\n }\r\n\r\n /**\r\n * Get cache statistics\r\n * @returns Object with cache information\r\n */\r\n public getCacheStats(): { templateCount: number; totalSize: number } {\r\n return {\r\n templateCount: this._map.size,\r\n totalSize: JSON.stringify(this._map.entries().toArray(), (_, value) => {\r\n return typeof value === `function` ? value.toString() : value\r\n }).length\r\n }\r\n }\r\n\r\n /**\r\n * Cleanup resources and close watchers\r\n * @returns Promise void\r\n */\r\n public async destroy(): Promise<void> {\r\n if (this._watcher) {\r\n await this._watcher.close()\r\n }\r\n this._map.clear()\r\n }\r\n}\r\n"],"mappings":"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","names":["index_exports","__export","BaseGeneral","CacheExternal","Ctx","Gramstax","TemplateEngine","TemplateManager","__toCommonJS","import_logging_pretty","BaseGeneral","__name","error","func","constructorName","funcName","import_keyv","import_redis","CacheExternal","url","namespace","ttl","more","store","KeyvRedis","__name","import_promises","import_grammy","Ctx","BaseGeneral","__name","v","params","ids","languageCode","keyboard","data","baseId","options","msgs","it","index","id","msg","type","method","moreRoot","value","result","callback","args","tkey","key","ckb","ikb","arr","rkb","kb","name","paramsAdd","str","fbCallbackData","tag","prefix","import_bun","import_node_path","import_logging_pretty","TemplateEngine","__name","str","template","_","key","baseRegex","result","match","idValue","cleaned","rawCode","innerCode","inner","messageRegex","lang","rawContent","keyboardRegex","forAttr","mode","isArray","singleOrCombined","t","processed","functionBody","baseBlocks","baseId","baseContent","messages","content","keyboards","modes","processedLabels","label","import_promises","import_chokidar","import_node_path","import_node_fs","TemplateManager","__name","TemplateEngine","options","enableWatch","path","forceLanguage","error","filepath","filename","filePath","fileName","fileKey","validFiles","file","useSync","key","raw","extension","rawTemplate","keepIfExist","existing","compiled","updated","baseId","language","data","func","display","_","value","import_node_fs","import_grammy","Gramstax","__name","params","CacheExternal","TemplateManager","error","botInfo","method","data","username","ct","Ctx","baseUrl","handleUpdate","pathWebhook","req","pathname","timestamp","webhookUrl","Page","redacted","filePath","pages","name","proto","partPayload","partCommand","partCaption","partFree","pd","pds","upFirst","s","getPureFuncName","func","buildSessionMethod","index","ps","psi","pss","value","p","_name","path","files","initStatic","initStaticIntent","initStaticSession","initDynamicSpesific","listFuncStatic","listFuncStaticIntent","listFuncStaticSession","makeObject","keys","val","k","file","module","ctx","fromListener","res","cd","mt","mc","funcName","session","mtd","cdi","mti","mci","arrFree","initRoute","listenerName","isEdit"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/base/general.ts","../../src/cache/external.ts","../../src/core/ctx.ts","../../src/core/bot.ts","../../src/template/engine.ts","../../src/template/manager.ts"],"sourcesContent":["import { LoggingPretty } from \"logging-pretty\"\r\n\r\nexport abstract class BaseGeneral {\r\n public static log = new LoggingPretty()\r\n public static logError(error: any, func: string) {\r\n // const name = typeof this.name != `string` ? this.toString().match(/class\\s+([^\\s{]+)/)?.[1] : this.name\r\n this.log.error(`[${this.toString().match(/class\\s+([^\\s{]+)/)?.[1]}:${func}]: ${String(error)}`)\r\n }\r\n\r\n // protected logError(error: any, func: string, name?: string) {\r\n // log.error(`[${name || this.constructor.name}:${func}]: ${String(error)}`)\r\n // }\r\n\r\n public logError(error: any, constructorName?: string, funcName?: string) {\r\n ;(this.constructor as any).log.error(`[${constructorName || this.constructor.name}:${funcName}] ${String(error)}`)\r\n }\r\n}\r\n","import { Keyv } from \"keyv\"\r\nimport KeyvRedis from \"@keyv/redis\"\r\n\r\ntype IMore = Omit<Required<ConstructorParameters<typeof Keyv>>[0], `store` | `namespace` | `ttl`> & { forceStore?: any }\r\n\r\nexport class CacheExternal extends Keyv {\r\n constructor(public url: string | `memory` = `memory`, namespace?: string, ttl?: number, more?: IMore) {\r\n let store: any\r\n if (url.startsWith(`redis`)) store = new KeyvRedis(url)\r\n if (url === `memory`) store = new Map()\r\n if (more?.forceStore) store = more.forceStore\r\n\r\n super({ store, namespace, ttl })\r\n }\r\n}\r\n","import { setTimeout } from \"node:timers/promises\"\r\nimport { BaseGeneral } from \"../base\"\r\nimport { CacheExternal } from \"../cache\"\r\nimport { TemplateManager } from \"../template\"\r\nimport { InlineKeyboard, Keyboard, type Context } from \"grammy\"\r\n\r\ntype IData = { name: string; callbackData: (...args: any) => string | any }\r\ntype ITemp = { session: { method?: string; params?: any }; data: Partial<IData>; [key: string]: any }\r\n\r\nexport class Ctx extends BaseGeneral {\r\n public static template?: string // string html\r\n public static data: IData // for external access (**.data). example StartPage.data.callbackData\r\n public data = (this as any).constructor.data as IData // for internal access (this.**). example this.data.callbackData\r\n\r\n public get isPremium() {\r\n return this.ct.from?.is_premium ?? false\r\n }\r\n public get isBot() {\r\n return this.ct.from?.is_bot ?? false\r\n }\r\n public get userid() {\r\n return this.ct.from?.id as number\r\n }\r\n public get username() {\r\n return this.ct.from?.username as string\r\n }\r\n public get fullname() {\r\n return `${this.ct.from?.first_name || ``}${this.ct.from?.last_name || ``}`\r\n }\r\n public get firstname() {\r\n return this.ct.from?.first_name as string\r\n }\r\n public get lastname() {\r\n return this.ct.from?.last_name as string\r\n }\r\n public get msgText() {\r\n return this.ct.message?.text as string\r\n }\r\n public get msgTextIntent() {\r\n return this.msgText && this.msgText.indexOf(` `) != -1 ? (this.msgText.split(` `)[0] as string) : ``\r\n }\r\n public get msgTextPayloads() {\r\n return this.msgText && this.msgText.indexOf(` `) != -1 ? (this.msgText.split(` `).slice(1) as any[]) : ([] as any[])\r\n }\r\n public get msgTextPayload() {\r\n return this.msgTextPayloads[0] as string\r\n }\r\n public get msgCaption() {\r\n return this.ct.message?.caption as string\r\n }\r\n public get msgCaptionIntent() {\r\n return this.msgCaption && this.msgCaption.indexOf(` `) != -1 ? (this.msgCaption.split(` `)[0] as string) : ``\r\n }\r\n public get msgPhoto() {\r\n return this.ct.message?.photo\r\n }\r\n public get msgVideo() {\r\n return this.ct.message?.video\r\n }\r\n public get msgAudio() {\r\n return this.ct.message?.audio\r\n }\r\n public get callbackData() {\r\n return this.ct.callbackQuery?.data as string\r\n }\r\n public get callbackDataIntent() {\r\n return this.callbackData && this.callbackData.indexOf(`:`) != -1 ? (this.callbackData.split(`:`)[0] as string) : ``\r\n }\r\n public get callbackDataPayloads() {\r\n return this.callbackData && this.callbackData.indexOf(`:`) != -1 ? (this.callbackData.split(`:`).slice(1) as any[]) : ([] as any[])\r\n }\r\n public get callbackDataPayload() {\r\n return this.callbackDataPayloads?.[0] as string\r\n }\r\n public get callbackDataParts() {\r\n return this.callbackDataPayload && this.callbackDataPayload.indexOf(`+`) != -1 ? (this.callbackDataPayload.split(`+`) as any[]) : ([] as any[])\r\n }\r\n public get languageCode() {\r\n return this.ct.from?.language_code as string\r\n }\r\n public set languageCode(v: any) {\r\n ;(this as any).ct.from.language_code = v\r\n }\r\n public set session(v: any) {\r\n this.temp.session = v\r\n }\r\n public get session() {\r\n return this.temp.session\r\n }\r\n\r\n public ct: Context\r\n public cacheSession: CacheExternal\r\n public cacheKeyboard: Map<any, any>\r\n public templateManager: TemplateManager\r\n public temp: ITemp\r\n public constructor(params: { ct: Context; cacheSession: CacheExternal; cacheKeyboard: Map<any, any>; templateManager: TemplateManager; temp: ITemp }) {\r\n super()\r\n this.ct = params.ct\r\n this.cacheSession = params.cacheSession\r\n this.cacheKeyboard = params.cacheKeyboard\r\n this.templateManager = params.templateManager\r\n this.temp = params.temp\r\n if ((params as any)?.data) {\r\n this.temp.data = (params as any).data\r\n }\r\n }\r\n\r\n public async broadcast(ids: any[], languageCode: any[], keyboard?: Keyboard | InlineKeyboard, data?: Record<string, any>, baseId?: string, options?: any) {\r\n const limitFree = 30\r\n const msgs = languageCode.map((it) => this.templateManager.getMessage(this.data.name, baseId, it, data)) as any[]\r\n for (let index = 0; index < ids.length; index++) {\r\n const id = ids[index]\r\n const msg = msgs[index]\r\n await this.ct.api.sendMessage(id, msg, {\r\n parse_mode: `HTML`,\r\n reply_markup: keyboard,\r\n ...options\r\n })\r\n\r\n if (index + 1 == limitFree) {\r\n await setTimeout(1200)\r\n }\r\n }\r\n }\r\n\r\n public async reply(keyboard?: Keyboard | InlineKeyboard, data?: Record<string, any>, baseId?: string, options?: any) {\r\n const msg = this.templateManager.getMessage(this.data.name, baseId, this.languageCode, data)\r\n return await this.ct.reply(msg, {\r\n parse_mode: `HTML`,\r\n reply_markup: keyboard,\r\n ...options\r\n })\r\n }\r\n\r\n public async replyAction(type: Parameters<typeof this.ct.replyWithChatAction>[0]) {\r\n return await this.ct.replyWithChatAction(type)\r\n }\r\n\r\n public async edit(keyboard?: Keyboard | InlineKeyboard, data?: Record<string, any>, baseId?: string, options?: any) {\r\n try {\r\n const msg = this.templateManager.getMessage(this.data.name, baseId, this.languageCode, data)\r\n return await this.ct.editMessageText(msg, {\r\n parse_mode: `HTML`,\r\n reply_markup: keyboard,\r\n ...options\r\n })\r\n } catch (error) {\r\n await this.reply(keyboard, data, baseId, options)\r\n }\r\n }\r\n\r\n public async delete() {\r\n return await this.ct.deleteMessage()\r\n }\r\n\r\n public async callbackQueryAnswer(options?: any) {\r\n try {\r\n return await this.ct.answerCallbackQuery(options)\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n public async sessionSet(method: string, params: any, ...moreRoot: any) {\r\n try {\r\n const value = { method, params, ...moreRoot }\r\n const result = await this.cacheSession.set(`${this.userid}`, { method, params, ...moreRoot })\r\n if (result) {\r\n this.session = value\r\n }\r\n return result\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n public async sessionGet(): Promise<{ method: string; params: any; [moreRoot: string]: any } | null> {\r\n try {\r\n const result = await this.cacheSession.get(`${this.userid}`)\r\n if (result) {\r\n this.session = result\r\n }\r\n return result || null\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n public async sessionClear() {\r\n try {\r\n const result = await this.cacheSession.delete(`${this.userid}`)\r\n if (result) {\r\n this.session = {}\r\n }\r\n return result\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n // =============== build data\r\n\r\n public static buildData<C extends ((...args: any[]) => any) | undefined = undefined>(callback?: C) {\r\n return {\r\n name: ``,\r\n callbackData: callback\r\n ? function (this: { name: string }, ...args: Parameters<Exclude<C, undefined>>): ReturnType<Exclude<C, undefined>> {\r\n const params = callback(...args)\r\n return `${this.name}${params === undefined ? `` : `:${params}`}` as any\r\n }\r\n : function (this: { name: string }) {\r\n return this?.name\r\n }\r\n }\r\n }\r\n\r\n // =============== build keyboard\r\n\r\n public buildInlineKeyboard(callback: (kb: InlineKeyboard, arr: any[]) => InlineKeyboard, params?: { baseId?: any; data?: Record<string, any>; cache?: boolean }): InlineKeyboard {\r\n const tkey = this.data.name\r\n if (params?.cache === true) {\r\n const key = `${tkey}:${this.languageCode}:inline`\r\n const ckb = this.cacheKeyboard.get(key)\r\n if (!ckb) {\r\n const ikb = new InlineKeyboard()\r\n const arr = this.templateManager.getKeyboard(tkey, params?.baseId, this.languageCode, `inline`, params?.data)\r\n const rkb = callback(ikb, arr)\r\n this.cacheKeyboard.set(key, rkb)\r\n return rkb\r\n }\r\n return ckb\r\n }\r\n const ikb = new InlineKeyboard()\r\n const arr = this.templateManager.getKeyboard(tkey, params?.baseId, this.languageCode, `inline`, params?.data)\r\n const rkb = callback(ikb, arr)\r\n return rkb\r\n }\r\n\r\n public buildKeyboard(callback: (kb: Keyboard, arr: any[]) => Keyboard, params?: { baseId?: any; data?: Record<string, any>; cache?: boolean }): Keyboard {\r\n const tkey = this.data.name\r\n if (params?.cache === true) {\r\n const key = `${tkey}:${this.languageCode}:default`\r\n const ckb = this.cacheKeyboard.get(key)\r\n if (!ckb) {\r\n const kb = new Keyboard()\r\n const arr = this.templateManager.getKeyboard(tkey, params?.baseId, this.languageCode, `default`, params?.data)\r\n const rkb = callback(kb, arr)\r\n rkb.resized(true)\r\n this.cacheKeyboard.set(key, rkb)\r\n return rkb\r\n }\r\n return ckb\r\n }\r\n const kb = new Keyboard()\r\n const arr = this.templateManager.getKeyboard(tkey, params?.baseId, this.languageCode, `default`, params?.data)\r\n const rkb = callback(kb, arr)\r\n rkb.resized()\r\n return rkb\r\n }\r\n\r\n // =============== most common used function\r\n public async transition?(...args: any): Promise<void>\r\n public async internal?(...args: any): Promise<void>\r\n public async notify?(...args: any): Promise<void>\r\n\r\n // =============== route function\r\n // callback\r\n public async callback?(): Promise<void> // example: start\r\n public async callbackPayload?(): Promise<void> // example: start:{DYNAMIC}\r\n // text\r\n public async text?(): Promise<void> // example: start\r\n public async textPayload?(): Promise<void> // example: start {...DYNAMIC}\r\n public async textCommand?(): Promise<void> // example: /start\r\n public async textCommandPayload?(): Promise<void> // example: /start {...DYNAMIC}\r\n public async textFree?(): Promise<void> // example (for session): {...DYNAMIC}\r\n\r\n // photo\r\n public async photoCaption?(): Promise<void>\r\n public async photoCaptionPayload?(): Promise<void>\r\n public async photoCaptionCommand?(): Promise<void>\r\n public async photoCaptionCommandPayload?(): Promise<void>\r\n public async photoFree?(): Promise<void>\r\n // video\r\n public async videoCaption?(): Promise<void>\r\n public async videoCaptionPayload?(): Promise<void>\r\n public async videoCaptionCommand?(): Promise<void>\r\n public async videoCaptionCommandPayload?(): Promise<void>\r\n public async videoFree?(): Promise<void>\r\n // audio\r\n public async audioCaption?(): Promise<void>\r\n public async audioCaptionPayload?(): Promise<void>\r\n public async audioCaptionCommand?(): Promise<void>\r\n public async audioCaptionCommandPayload?(): Promise<void>\r\n public async audioFree?(): Promise<void>\r\n // document\r\n public async documentCaption?(): Promise<void>\r\n public async documentCaptionPayload?(): Promise<void>\r\n public async documentCaptionCommand?(): Promise<void>\r\n public async documentCaptionCommandPayload?(): Promise<void>\r\n public async documentFree?(): Promise<void>\r\n // animation\r\n public async animationCaption?(): Promise<void>\r\n public async animationCaptionPayload?(): Promise<void>\r\n public async animationCaptionCommand?(): Promise<void>\r\n public async animationCaptionCommandPayload?(): Promise<void>\r\n public async animationFree?(): Promise<void>\r\n // voiceNote\r\n public async voiceCaption?(): Promise<void>\r\n public async voiceCaptionPayload?(): Promise<void>\r\n public async voiceCaptionCommand?(): Promise<void>\r\n public async voiceCaptionCommandPayload?(): Promise<void>\r\n public async voiceFree?(): Promise<void>\r\n // videoNote\r\n public async videoNoteCaption?(): Promise<void>\r\n public async videoNoteCaptionPayload?(): Promise<void>\r\n public async videoNoteCaptionCommand?(): Promise<void>\r\n public async videoNoteCaptionCommandPayload?(): Promise<void>\r\n public async videoNoteFree?(): Promise<void>\r\n // sticker\r\n public async stickerFree?(): Promise<void>\r\n // location\r\n public async locationFree?(): Promise<void>\r\n // contact\r\n public async contactFree?(): Promise<void>\r\n // all\r\n public async free?(): Promise<void>\r\n\r\n // =============== session validate\r\n // callback\r\n\r\n public validateSessionCallback(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodCallback(name)\r\n }\r\n\r\n public validateSessionCallbackPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodCallbackPayload(name)\r\n }\r\n\r\n // text\r\n\r\n public validateSessionText(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodText(name)\r\n }\r\n\r\n public validateSessionTextPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodTextPayload(name)\r\n }\r\n\r\n public validateSessionTextCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodTextCommand(name)\r\n }\r\n\r\n public validateSessionTextCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodTextCommandPayload(name)\r\n }\r\n\r\n public validateSessionTextFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodTextFree(name)\r\n }\r\n\r\n // photo\r\n\r\n public validateSessionPhotoCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodPhotoCaption(name)\r\n }\r\n\r\n public validateSessionPhotoCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodPhotoCaptionPayload(name)\r\n }\r\n\r\n public validateSessionPhotoCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodPhotoCaptionCommand(name)\r\n }\r\n\r\n public validateSessionPhotoCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodPhotoCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionPhotoFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodPhotoFree(name)\r\n }\r\n\r\n // video\r\n\r\n public validateSessionVideoCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoCaption(name)\r\n }\r\n\r\n public validateSessionVideoCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoCaptionPayload(name)\r\n }\r\n\r\n public validateSessionVideoCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoCaptionCommand(name)\r\n }\r\n\r\n public validateSessionVideoCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionVideoFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoFree(name)\r\n }\r\n\r\n // audio\r\n\r\n public validateSessionAudioCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAudioCaption(name)\r\n }\r\n\r\n public validateSessionAudioCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAudioCaptionPayload(name)\r\n }\r\n\r\n public validateSessionAudioCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAudioCaptionCommand(name)\r\n }\r\n\r\n public validateSessionAudioCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAudioCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionAudioFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAudioFree(name)\r\n }\r\n\r\n // document\r\n\r\n public validateSessionDocumentCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodDocumentCaption(name)\r\n }\r\n\r\n public validateSessionDocumentCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodDocumentCaptionPayload(name)\r\n }\r\n\r\n public validateSessionDocumentCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodDocumentCaptionCommand(name)\r\n }\r\n\r\n public validateSessionDocumentCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodDocumentCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionDocumentFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodDocumentFree(name)\r\n }\r\n\r\n // animation\r\n\r\n public validateSessionAnimationCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAnimationCaption(name)\r\n }\r\n\r\n public validateSessionAnimationCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAnimationCaptionPayload(name)\r\n }\r\n\r\n public validateSessionAnimationCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAnimationCaptionCommand(name)\r\n }\r\n\r\n public validateSessionAnimationCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAnimationCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionAnimationFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodAnimationFree(name)\r\n }\r\n\r\n // voice\r\n\r\n public validateSessionVoiceCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVoiceCaption(name)\r\n }\r\n\r\n public validateSessionVoiceCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVoiceCaptionPayload(name)\r\n }\r\n\r\n public validateSessionVoiceCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVoiceCaptionCommand(name)\r\n }\r\n\r\n public validateSessionVoiceCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVoiceCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionVoiceFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVoiceFree(name)\r\n }\r\n\r\n // video note\r\n\r\n public validateSessionVideoNoteCaption(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoNoteCaption(name)\r\n }\r\n\r\n public validateSessionVideoNoteCaptionPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoNoteCaptionPayload(name)\r\n }\r\n\r\n public validateSessionVideoNoteCaptionCommand(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoNoteCaptionCommand(name)\r\n }\r\n\r\n public validateSessionVideoNoteCaptionCommandPayload(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoNoteCaptionCommandPayload(name)\r\n }\r\n\r\n public validateSessionVideoNoteFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodVideoNoteFree(name)\r\n }\r\n\r\n // sticker\r\n\r\n public validateSessionStickerFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodStickerFree(name)\r\n }\r\n\r\n // location\r\n\r\n public validateSessionLocationFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodLocationFree(name)\r\n }\r\n\r\n // contact\r\n\r\n public validateSessionContactFree(method?: string, name?: string) {\r\n if (method === undefined) {\r\n method = this.session.method\r\n }\r\n return method === undefined ? false : method === this.buildSessionMethodContactFree(name)\r\n }\r\n\r\n // =============== session set\r\n // callback\r\n\r\n public sessionCallback(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodCallback(name), params)\r\n }\r\n\r\n public sessionCallbackPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodCallbackPayload(name), params)\r\n }\r\n\r\n // text\r\n\r\n public sessionText(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodText(name), params)\r\n }\r\n\r\n public sessionTextPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodTextPayload(name), params)\r\n }\r\n\r\n public sessionTextCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodTextCommand(name), params)\r\n }\r\n\r\n public sessionTextCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodTextCommandPayload(name), params)\r\n }\r\n\r\n public sessionTextFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodTextFree(name), params)\r\n }\r\n\r\n // photo\r\n\r\n public sessionPhotoCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodPhotoCaption(name), params)\r\n }\r\n\r\n public sessionPhotoCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodPhotoCaptionPayload(name), params)\r\n }\r\n\r\n public sessionPhotoCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodPhotoCaptionCommand(name), params)\r\n }\r\n\r\n public sessionPhotoCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodPhotoCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionPhotoFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodPhotoFree(name), params)\r\n }\r\n\r\n // video\r\n\r\n public sessionVideoCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoCaption(name), params)\r\n }\r\n\r\n public sessionVideoCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoCaptionPayload(name), params)\r\n }\r\n\r\n public sessionVideoCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoCaptionCommand(name), params)\r\n }\r\n\r\n public sessionVideoCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionVideoFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoFree(name), params)\r\n }\r\n\r\n // audio\r\n\r\n public sessionAudioCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAudioCaption(name), params)\r\n }\r\n\r\n public sessionAudioCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAudioCaptionPayload(name), params)\r\n }\r\n\r\n public sessionAudioCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAudioCaptionCommand(name), params)\r\n }\r\n\r\n public sessionAudioCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAudioCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionAudioFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAudioFree(name), params)\r\n }\r\n\r\n // document\r\n\r\n public sessionDocumentCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodDocumentCaption(name), params)\r\n }\r\n\r\n public sessionDocumentCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodDocumentCaptionPayload(name), params)\r\n }\r\n\r\n public sessionDocumentCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodDocumentCaptionCommand(name), params)\r\n }\r\n\r\n public sessionDocumentCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodDocumentCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionDocumentFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodDocumentFree(name), params)\r\n }\r\n\r\n // animation\r\n\r\n public sessionAnimationCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAnimationCaption(name), params)\r\n }\r\n\r\n public sessionAnimationCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAnimationCaptionPayload(name), params)\r\n }\r\n\r\n public sessionAnimationCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAnimationCaptionCommand(name), params)\r\n }\r\n\r\n public sessionAnimationCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAnimationCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionAnimationFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodAnimationFree(name), params)\r\n }\r\n\r\n // voice\r\n\r\n public sessionVoiceCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVoiceCaption(name), params)\r\n }\r\n\r\n public sessionVoiceCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVoiceCaptionPayload(name), params)\r\n }\r\n\r\n public sessionVoiceCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVoiceCaptionCommand(name), params)\r\n }\r\n\r\n public sessionVoiceCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVoiceCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionVoiceFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVoiceFree(name), params)\r\n }\r\n\r\n // video note\r\n\r\n public sessionVideoNoteCaption(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoNoteCaption(name), params)\r\n }\r\n\r\n public sessionVideoNoteCaptionPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoNoteCaptionPayload(name), params)\r\n }\r\n\r\n public sessionVideoNoteCaptionCommand(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoNoteCaptionCommand(name), params)\r\n }\r\n\r\n public sessionVideoNoteCaptionCommandPayload(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoNoteCaptionCommandPayload(name), params)\r\n }\r\n\r\n public sessionVideoNoteFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodVideoNoteFree(name), params)\r\n }\r\n\r\n // sticker\r\n\r\n public sessionStickerFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodStickerFree(name), params)\r\n }\r\n\r\n // location\r\n\r\n public sessionLocationFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodLocationFree(name), params)\r\n }\r\n\r\n // contact\r\n\r\n public sessionContactFree(params?: any, name?: string) {\r\n return this.sessionSet(this.buildSessionMethodContactFree(name), params)\r\n }\r\n\r\n // =============== session update to set\r\n // callback\r\n\r\n public sessionToCallback(paramsAdd?: any, name?: string) {\r\n return this.sessionCallback({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToCallbackPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionCallbackPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // text\r\n\r\n public sessionToText(paramsAdd?: any, name?: string) {\r\n return this.sessionText({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToTextPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionTextPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToTextCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionTextCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToTextCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionTextCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToTextFree(paramsAdd?: any, name?: string) {\r\n return this.sessionTextFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // photo\r\n\r\n public sessionToPhotoCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionPhotoCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToPhotoCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionPhotoCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToPhotoCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionPhotoCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToPhotoCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionPhotoCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToPhotoFree(paramsAdd?: any, name?: string) {\r\n return this.sessionPhotoFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // video\r\n\r\n public sessionToVideoCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoFree(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // audio\r\n\r\n public sessionToAudioCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionAudioCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAudioCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionAudioCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAudioCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionAudioCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAudioCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionAudioCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAudioFree(paramsAdd?: any, name?: string) {\r\n return this.sessionAudioFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // document\r\n\r\n public sessionToDocumentCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionDocumentCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToDocumentCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionDocumentCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToDocumentCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionDocumentCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToDocumentCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionDocumentCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToDocumentFree(paramsAdd?: any, name?: string) {\r\n return this.sessionDocumentFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // animation\r\n\r\n public sessionToAnimationCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionAnimationCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAnimationCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionAnimationCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAnimationCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionAnimationCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAnimationCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionAnimationCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToAnimationFree(paramsAdd?: any, name?: string) {\r\n return this.sessionAnimationFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // voice\r\n\r\n public sessionToVoiceCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionVoiceCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVoiceCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVoiceCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVoiceCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionVoiceCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVoiceCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVoiceCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVoiceFree(paramsAdd?: any, name?: string) {\r\n return this.sessionVoiceFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // videonote\r\n\r\n public sessionToVideoNoteCaption(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoNoteCaption({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoNoteCaptionPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoNoteCaptionPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoNoteCaptionCommand(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoNoteCaptionCommand({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoNoteCaptionCommandPayload(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoNoteCaptionCommandPayload({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n public sessionToVideoNoteFree(paramsAdd?: any, name?: string) {\r\n return this.sessionVideoNoteFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // sticker\r\n\r\n public sessionToStickerFree(paramsAdd?: any, name?: string) {\r\n return this.sessionStickerFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // location\r\n\r\n public sessionToLocationFree(paramsAdd?: any, name?: string) {\r\n return this.sessionLocationFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // contact\r\n\r\n public sessionToContactFree(paramsAdd?: any, name?: string) {\r\n return this.sessionContactFree({ ...this.session.params, ...paramsAdd }, name)\r\n }\r\n\r\n // =============== build intent\r\n\r\n public buildIntent(str?: string, fbCallbackData = true) {\r\n if (!str) {\r\n str = fbCallbackData ? this.data.callbackData() : this.data.name\r\n }\r\n\r\n const tag = fbCallbackData ? `:` : ` `\r\n return str?.indexOf?.(tag) != -1 ? (str?.split?.(tag)?.[0] as string) : str\r\n }\r\n\r\n // =============== build session method\r\n\r\n public buildSessionMethod(prefix: string, name: string | undefined) {\r\n return `${prefix}-${name || this.data.name}`\r\n }\r\n\r\n // callback method\r\n\r\n public buildSessionMethodCallback(name?: string) {\r\n return this.buildSessionMethod(`1`, name)\r\n }\r\n\r\n public buildSessionMethodCallbackPayload(name?: string) {\r\n return this.buildSessionMethod(`2`, name)\r\n }\r\n\r\n // text method\r\n\r\n public buildSessionMethodText(name?: string) {\r\n return this.buildSessionMethod(`3`, name)\r\n }\r\n\r\n public buildSessionMethodTextPayload(name?: string) {\r\n return this.buildSessionMethod(`4`, name)\r\n }\r\n\r\n public buildSessionMethodTextCommand(name?: string) {\r\n return this.buildSessionMethod(`5`, name)\r\n }\r\n\r\n public buildSessionMethodTextCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`6`, name)\r\n }\r\n\r\n public buildSessionMethodTextFree(name?: string) {\r\n return this.buildSessionMethod(`7`, name)\r\n }\r\n\r\n // photo method\r\n\r\n public buildSessionMethodPhotoCaption(name?: string) {\r\n return this.buildSessionMethod(`8`, name)\r\n }\r\n\r\n public buildSessionMethodPhotoCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`9`, name)\r\n }\r\n\r\n public buildSessionMethodPhotoCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`10`, name)\r\n }\r\n\r\n public buildSessionMethodPhotoCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`11`, name)\r\n }\r\n\r\n public buildSessionMethodPhotoFree(name?: string) {\r\n return this.buildSessionMethod(`12`, name)\r\n }\r\n\r\n // video method\r\n\r\n public buildSessionMethodVideoCaption(name?: string) {\r\n return this.buildSessionMethod(`13`, name)\r\n }\r\n\r\n public buildSessionMethodVideoCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`14`, name)\r\n }\r\n\r\n public buildSessionMethodVideoCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`15`, name)\r\n }\r\n\r\n public buildSessionMethodVideoCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`16`, name)\r\n }\r\n\r\n public buildSessionMethodVideoFree(name?: string) {\r\n return this.buildSessionMethod(`17`, name)\r\n }\r\n\r\n // audio method\r\n\r\n public buildSessionMethodAudioCaption(name?: string) {\r\n return this.buildSessionMethod(`18`, name)\r\n }\r\n\r\n public buildSessionMethodAudioCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`19`, name)\r\n }\r\n\r\n public buildSessionMethodAudioCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`20`, name)\r\n }\r\n\r\n public buildSessionMethodAudioCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`21`, name)\r\n }\r\n\r\n public buildSessionMethodAudioFree(name?: string) {\r\n return this.buildSessionMethod(`22`, name)\r\n }\r\n\r\n // document method\r\n\r\n public buildSessionMethodDocumentCaption(name?: string) {\r\n return this.buildSessionMethod(`23`, name)\r\n }\r\n\r\n public buildSessionMethodDocumentCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`24`, name)\r\n }\r\n\r\n public buildSessionMethodDocumentCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`25`, name)\r\n }\r\n\r\n public buildSessionMethodDocumentCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`26`, name)\r\n }\r\n\r\n public buildSessionMethodDocumentFree(name?: string) {\r\n return this.buildSessionMethod(`27`, name)\r\n }\r\n\r\n // animation method\r\n\r\n public buildSessionMethodAnimationCaption(name?: string) {\r\n return this.buildSessionMethod(`28`, name)\r\n }\r\n public buildSessionMethodAnimationCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`29`, name)\r\n }\r\n public buildSessionMethodAnimationCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`30`, name)\r\n }\r\n public buildSessionMethodAnimationCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`31`, name)\r\n }\r\n public buildSessionMethodAnimationFree(name?: string) {\r\n return this.buildSessionMethod(`32`, name)\r\n }\r\n\r\n // voice method\r\n\r\n public buildSessionMethodVoiceCaption(name?: string) {\r\n return this.buildSessionMethod(`33`, name)\r\n }\r\n public buildSessionMethodVoiceCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`34`, name)\r\n }\r\n public buildSessionMethodVoiceCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`35`, name)\r\n }\r\n public buildSessionMethodVoiceCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`36`, name)\r\n }\r\n public buildSessionMethodVoiceFree(name?: string) {\r\n return this.buildSessionMethod(`37`, name)\r\n }\r\n\r\n // video note method\r\n public buildSessionMethodVideoNoteCaption(name?: string) {\r\n return this.buildSessionMethod(`38`, name)\r\n }\r\n public buildSessionMethodVideoNoteCaptionPayload(name?: string) {\r\n return this.buildSessionMethod(`39`, name)\r\n }\r\n public buildSessionMethodVideoNoteCaptionCommand(name?: string) {\r\n return this.buildSessionMethod(`40`, name)\r\n }\r\n public buildSessionMethodVideoNoteCaptionCommandPayload(name?: string) {\r\n return this.buildSessionMethod(`41`, name)\r\n }\r\n public buildSessionMethodVideoNoteFree(name?: string) {\r\n return this.buildSessionMethod(`42`, name)\r\n }\r\n public buildSessionMethodStickerFree(name?: string) {\r\n return this.buildSessionMethod(`43`, name) // sticker method\r\n }\r\n public buildSessionMethodLocationFree(name?: string) {\r\n return this.buildSessionMethod(`44`, name) // location method\r\n }\r\n public buildSessionMethodContactFree(name?: string) {\r\n return this.buildSessionMethod(`45`, name) // contact method\r\n }\r\n}\r\n","import { Ctx } from \"./ctx\"\r\nimport { serve } from \"bun\"\r\nimport { join, parse } from \"node:path\"\r\nimport { CacheExternal } from \"../cache\"\r\nimport { LoggingPretty } from \"logging-pretty\"\r\nimport { TemplateManager } from \"../template\"\r\nimport { existsSync, readdirSync } from \"node:fs\"\r\nimport { Bot, webhookCallback, type BotError, type Context } from \"grammy\"\r\nimport type { UserFromGetMe } from \"grammy/types\"\r\n\r\nexport class Gramstax {\r\n public templateManager: TemplateManager\r\n public cacheKeyboard: Map<any, any>\r\n public cacheSession: CacheExternal\r\n public pages: ReturnType<typeof this.pageLoads>\r\n public log: LoggingPretty | undefined | null\r\n public bot: Bot\r\n\r\n public constructor(params: { token: string; deploy: string; log?: LoggingPretty; cacheSession?: CacheExternal; cacheKeyboard?: Map<any, any>; templateManager?: TemplateManager }) {\r\n this.log = params.log === null ? undefined : params.log === undefined ? new LoggingPretty() : params.log\r\n this.cacheSession = params.cacheSession || new CacheExternal(`memory`, `session`)\r\n this.cacheKeyboard = params.cacheKeyboard || new Map()\r\n this.templateManager = params.templateManager || new TemplateManager({ path: null })\r\n\r\n this.bot = new Bot(params.token)\r\n this.bot.catch(this.onCatch)\r\n this.bot.on(`callback_query:data`, this.onCallbackQueryData.bind(this)) // Handle callback queries from inline keyboards\r\n this.bot.on(`message:text`, this.onMessageText.bind(this)) // Handle global text messages\r\n this.bot.on(`message:photo`, this.onMessagePhoto.bind(this)) // Handle global photo messages\r\n this.bot.on(`message:video`, this.onMessageVideo.bind(this)) // Handle global video messages\r\n this.bot.on(`message:audio`, this.onMessageAudio.bind(this)) // Handle global audio messages\r\n this.bot.on(`message:document`, this.onMessageDocument.bind(this)) // Handle global document messages\r\n this.bot.on(`message:animation`, this.onMessageAnimation.bind(this)) // Handle global animation messages\r\n this.bot.on(`message:voice`, this.onMessageVoice.bind(this)) // Handle global voice messages\r\n this.bot.on(`message:video_note`, this.onMessageVideoNote.bind(this)) // Handle global video note messages\r\n this.bot.on(`message:sticker`, this.onMessageSticker.bind(this)) // Handle global sticker messages\r\n this.bot.on(`message:location`, this.onMessageLocation.bind(this)) // Handle global location messages\r\n this.bot.on(`message:contact`, this.onMessageContact.bind(this)) // Handle global contact messages\r\n\r\n // Load pages AFTER templateManager is initialized\r\n this.pages = this.pageLoads()\r\n\r\n // Graceful shutdown\r\n process.once(`SIGINT`, () => this.bot.stop())\r\n process.once(`SIGTERM`, () => this.bot.stop())\r\n\r\n if (params.deploy.startsWith(`polling`)) {\r\n this.runPolling()\r\n } else if (params.deploy.startsWith(`webhook`)) {\r\n this.runWebhook(params.deploy.split(`webhook:`)[1] as string)\r\n }\r\n }\r\n\r\n public onCatch(error: BotError<Context>) {\r\n this.log?.error?.(`[Bot.catch]: ${String(error)}`)\r\n }\r\n\r\n public onStart(botInfo: UserFromGetMe, method: `polling` | `webhook`, data: string | null) {\r\n const { username } = botInfo\r\n if (method == `polling`) {\r\n this.log?.success?.(`Telegram bot polling started: ${username}`)\r\n } else {\r\n this.log?.success?.(`Telegram bot webhook started: ${username} (${data})`)\r\n }\r\n }\r\n\r\n public initCtx(ct: Context) {\r\n return new Ctx({\r\n ct,\r\n cacheSession: this.cacheSession,\r\n cacheKeyboard: this.cacheKeyboard,\r\n templateManager: this.templateManager,\r\n temp: {\r\n session: {},\r\n data: {}\r\n }\r\n })\r\n }\r\n\r\n public async runPolling() {\r\n this.bot.start({\r\n onStart: async (botInfo) => {\r\n this.onStart(botInfo, `polling`, null)\r\n }\r\n })\r\n }\r\n\r\n public async runWebhook(baseUrl: string) {\r\n const handleUpdate = webhookCallback(this.bot, `bun`)\r\n const pathWebhook = `/telegram-webhook`\r\n serve({\r\n fetch(req) {\r\n const { pathname } = new URL(req.url)\r\n if (pathname === pathWebhook) {\r\n if (req.method === `POST`) {\r\n return handleUpdate(req as any)\r\n }\r\n return new Response(`OK`, { status: 200 })\r\n }\r\n\r\n if (pathname === `/` && req.method === `GET`) {\r\n const timestamp = new Date().toISOString()\r\n return new Response(JSON.stringify({ timestamp }), {\r\n status: 200,\r\n headers: { \"Content-Type\": `application/json` }\r\n })\r\n }\r\n\r\n // Jika tidak cocok\r\n return new Response(`Not found`, { status: 404 })\r\n }\r\n })\r\n\r\n const data = await this.bot.api.getWebhookInfo()\r\n const webhookUrl = baseUrl.endsWith(`/`) ? baseUrl.slice(0, -1) + pathWebhook : baseUrl + pathWebhook\r\n if (data.url != webhookUrl) {\r\n await this.bot.api.setWebhook(webhookUrl)\r\n }\r\n\r\n const botInfo = await this.bot.api.getMe()\r\n this.onStart(botInfo, `webhook`, webhookUrl)\r\n }\r\n\r\n public pageCompile(Page: typeof Ctx, redacted = true) {\r\n if (Page?.template !== undefined) {\r\n this.templateManager.compile(Page.data.name, Page.template)\r\n if (redacted) {\r\n Page.template = undefined // redacted to reduce memory\r\n }\r\n } else {\r\n Page.template = undefined\r\n }\r\n }\r\n\r\n public pageBuildData(Page: typeof Ctx, filePath: string) {\r\n if (Page?.data === undefined) {\r\n Page.data = Page.buildData()\r\n }\r\n Page.data.name = parse(filePath).name\r\n }\r\n\r\n public pageSorts(Page: typeof Ctx, pages: typeof this.pages) {\r\n const name = Page.data.name\r\n const proto = Page.prototype\r\n\r\n const partPayload = `Payload`\r\n const partCommand = `Command`\r\n const partCaption = `Caption`\r\n const partFree = `Free`\r\n\r\n const pd = pages.dynamic\r\n const pds = pages.dynamicSpesific\r\n\r\n const upFirst = (s: string) => s.charAt(0).toUpperCase() + s.slice(1)\r\n const getPureFuncName = (func: string) => func.replace(partPayload, ``).replace(partCommand, ``).replace(partCaption, ``).replace(partFree, ``)\r\n const buildSessionMethod = (func: string, name: any) => (proto as any)[`buildSessionMethod${upFirst(func)}`](name)\r\n\r\n // all\r\n pages.all[name] = Page\r\n\r\n for (let index = 0; index < pages.lenListFuncStaticSession; index++) {\r\n const func = pages.listFuncStaticSession[index] as string\r\n\r\n const ps = pages.static[func as keyof typeof pages.static]\r\n const psi = pages.staticIntent[func as keyof typeof pages.staticIntent]\r\n const pss = pages.staticSession[func as keyof typeof pages.staticSession]\r\n\r\n const value = { name, func } as any\r\n const p = ps || psi\r\n if (p !== undefined) {\r\n const _name = func.includes(partCommand) ? `/${name}` : name\r\n p[proto.buildIntent(_name, func.startsWith(`callback`))] = value\r\n }\r\n\r\n // staticSession\r\n if (pss !== undefined) {\r\n pss[buildSessionMethod(func, name)] = value\r\n }\r\n\r\n // dynamicStatic\r\n if (func.toLowerCase().endsWith(`free`)) {\r\n pds[getPureFuncName(func) as keyof typeof pds].push(value)\r\n }\r\n }\r\n\r\n // all\r\n if (proto.free) {\r\n pd.push(name)\r\n }\r\n }\r\n\r\n public pageLoads() {\r\n this.log?.info?.(`Load pages..`)\r\n\r\n const path = join(process.cwd(), `src`, `pages`)\r\n if (!existsSync(path)) {\r\n throw new Error(`Folder ${path} is not found, please make it manually`)\r\n }\r\n\r\n const files = readdirSync(path)\r\n const initStatic = {} as Record<string, { name: string; func: string }> // { [page.data.name]: { name: Page.data.name, func: routeFunctionName } }\r\n const initStaticIntent = initStatic // { [intent]: { name: page.data.name, func: routeFunctionName } }\r\n const initStaticSession = initStatic // { [session.method]: { name: page.data.name, func: routeFunctionName } }\r\n const initDynamicSpesific = [] as { name: string; func: string }[] //\r\n\r\n const listFuncStatic = [\r\n // callback\r\n `callback`,\r\n // text\r\n `text`,\r\n `textCommand`,\r\n // photo\r\n `photoCaption`,\r\n `photoCaptionCommand`,\r\n // video\r\n `videoCaption`,\r\n `videoCaptionCommand`,\r\n // audio\r\n `audioCaption`,\r\n `audioCaptionCommand`,\r\n // document\r\n `documentCaption`,\r\n `documentCaptionCommand`,\r\n // animation\r\n `animationCaption`,\r\n `animationCaptionCommand`,\r\n // voice\r\n `voiceCaption`,\r\n `voiceCaptionCommand`,\r\n // videoNote\r\n `videoNoteCaption`,\r\n `videoNoteCaptionCommand`\r\n ] as const\r\n const listFuncStaticIntent = [\r\n // callback\r\n `callbackPayload`,\r\n // text\r\n `textPayload`,\r\n `textCommandPayload`,\r\n // photo\r\n `photoCaptionPayload`,\r\n `photoCaptionCommandPayload`,\r\n // video\r\n `videoCaptionPayload`,\r\n `videoCaptionCommandPayload`,\r\n // audio\r\n `audioCaptionPayload`,\r\n `audioCaptionCommandPayload`,\r\n // document\r\n `documentCaptionPayload`,\r\n `documentCaptionCommandPayload`,\r\n // animation\r\n `animationCaptionPayload`,\r\n `animationCaptionCommandPayload`,\r\n // voice\r\n `voiceCaptionPayload`,\r\n `voiceCaptionCommandPayload`,\r\n // video note\r\n `videoNoteCaptionPayload`,\r\n `videoNoteCaptionCommandPayload`\r\n ] as const\r\n const listFuncStaticSession = [\r\n ...listFuncStatic,\r\n ...listFuncStaticIntent,\r\n // text\r\n `textFree`,\r\n // photo\r\n `photoFree`,\r\n // video\r\n `videoFree`,\r\n // audio\r\n `audioFree`,\r\n // document\r\n `documentFree`,\r\n // animation\r\n `animationFree`,\r\n // voice\r\n `voiceFree`,\r\n // videoNote\r\n `videoNoteFree`,\r\n // sticker\r\n `stickerFree`,\r\n // location\r\n `locationFree`,\r\n // contact\r\n `contactFree`\r\n ] as const\r\n\r\n const makeObject = <const T extends readonly string[], V>(keys: T, val: V): { [K in T[number]]: V } => Object.fromEntries(keys.map((k) => [k, { ...val }])) as { [K in T[number]]: V }\r\n\r\n const pages = {\r\n all: {} as Record<string, typeof Ctx>, // (classes) all Page\r\n dynamic: [] as string[], // (dynamic) all Page function free\r\n dynamicSpesific: {\r\n text: initDynamicSpesific,\r\n photo: initDynamicSpesific,\r\n video: initDynamicSpesific,\r\n audio: initDynamicSpesific,\r\n document: initDynamicSpesific,\r\n animation: initDynamicSpesific,\r\n voice: initDynamicSpesific,\r\n videoNote: initDynamicSpesific,\r\n sticker: initDynamicSpesific,\r\n location: initDynamicSpesific,\r\n contact: initDynamicSpesific\r\n },\r\n static: makeObject(listFuncStatic, initStatic),\r\n staticIntent: makeObject(listFuncStaticIntent, initStaticIntent),\r\n staticSession: makeObject(listFuncStaticSession, initStaticSession),\r\n listFuncStatic,\r\n listFuncStaticIntent,\r\n listFuncStaticSession,\r\n lenListFuncStatic: listFuncStatic.length,\r\n lenListFuncStaticIntent: listFuncStaticIntent.length,\r\n lenListFuncStaticSession: listFuncStaticSession.length\r\n }\r\n\r\n for (const file of files) {\r\n const filePath = join(path, file)\r\n const module = require(filePath) // eslint-disable-line\r\n const exports = Object.values(module)\r\n const Page = exports[0] as typeof Ctx // like StartPage. not have default export\r\n if (Page === undefined) {\r\n throw `file ${parse(filePath).name} must have export (not default) class page`\r\n }\r\n\r\n // create if not exist and set name (without ext) according filePath\r\n this.pageBuildData(Page, filePath)\r\n\r\n // if the raw template writes directly to the Page class, do a compile\r\n this.pageCompile(Page)\r\n\r\n // sort route method\r\n this.pageSorts(Page, pages)\r\n }\r\n\r\n this.log?.info?.(`Finish load pages with total (${Object.keys(pages.all).length})`)\r\n return pages\r\n }\r\n\r\n public async pageRoutes(ctx: Ctx, fromListener: `callback` | keyof typeof this.pages.dynamicSpesific): Promise<any | null> {\r\n // to be reassigned\r\n let Page: typeof Ctx | undefined\r\n let res: { name: string; func: string } | undefined\r\n\r\n // (static) priority O(1)\r\n if (Page === undefined) {\r\n const cd = ctx.callbackData\r\n const mt = ctx.msgText\r\n const mc = ctx.msgCaption\r\n const ps = this.pages.static\r\n\r\n for (let index = 0; index < this.pages.lenListFuncStatic; index++) {\r\n const funcName = this.pages.listFuncStatic[index] as `animationCaption`\r\n res = ps[funcName][cd || mt || mc]\r\n if (res) {\r\n break\r\n }\r\n }\r\n\r\n if (res !== undefined) {\r\n Page = this.pages.all[res.name]\r\n }\r\n }\r\n\r\n // (staticSession) x = method; O(x)\r\n if (Page === undefined) {\r\n const session = await ctx.sessionGet()\r\n if (session) {\r\n const mtd = session.method\r\n const pss = this.pages.staticSession\r\n\r\n for (let index = 0; index < this.pages.lenListFuncStaticSession; index++) {\r\n const funcName = this.pages.listFuncStaticSession[index] as `animationCaption`\r\n res = pss[funcName][mtd]\r\n if (res) {\r\n break\r\n }\r\n }\r\n\r\n if (res !== undefined) {\r\n Page = this.pages.all[res.name]\r\n }\r\n }\r\n }\r\n\r\n // (staticIntent) x = startsWith; O(x)\r\n if (Page === undefined) {\r\n const cdi = ctx.callbackDataIntent\r\n const mti = ctx.msgTextIntent\r\n const mci = ctx.msgCaptionIntent\r\n const psi = this.pages.staticIntent\r\n\r\n for (let index = 0; index < this.pages.lenListFuncStaticIntent; index++) {\r\n const funcName = this.pages.listFuncStaticIntent[index] as `animationCaptionCommandPayload`\r\n res = psi[funcName][cdi || mti || mci]\r\n if (res) {\r\n break\r\n }\r\n }\r\n\r\n if (res !== undefined) {\r\n Page = this.pages.all[res.name]\r\n }\r\n }\r\n\r\n // run\r\n if (Page !== undefined && res !== undefined) {\r\n const initPage = new Page(ctx)\r\n const initRoute = await initPage[res.func as keyof typeof initPage]?.()\r\n return initRoute\r\n }\r\n\r\n // (dynamicSpesific) O(n)\r\n const arrFree = this.pages.dynamicSpesific[fromListener as keyof typeof this.pages.dynamicSpesific] || []\r\n for (let index = 0; index < arrFree.length; index++) {\r\n const value = arrFree[index]\r\n if (value === undefined) {\r\n continue\r\n }\r\n\r\n const Page = this.pages.all[value.func]\r\n if (Page === undefined) {\r\n continue\r\n }\r\n\r\n const initPage = new Page(ctx)\r\n const initRoute = await initPage[value.name as keyof typeof initPage]?.()\r\n // const initRoute = await initPage.route(value.name)\r\n if (initRoute !== null) {\r\n return initRoute // stop when return not null\r\n }\r\n }\r\n\r\n // (dynamic) O(n)\r\n for (let index = 0; index < this.pages.dynamic.length; index++) {\r\n const value = this.pages.dynamic[index]\r\n if (value === undefined) {\r\n continue\r\n }\r\n\r\n const Page = this.pages.all[value]\r\n if (Page === undefined) {\r\n continue\r\n }\r\n\r\n const initPage = new Page(ctx)\r\n const initRoute = await initPage.free?.()\r\n // const initRoute = await initPage.route(`free`)\r\n if (initRoute !== null) {\r\n return initRoute // stop when return not null\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n public async hookBeforeRoute(ctx: Ctx, listenerName: string) {\r\n // must be override\r\n return true\r\n }\r\n\r\n public async hookErrorPage(ctx: Ctx, listenerName: string, error: any, isEdit: boolean) {\r\n // must be override\r\n return\r\n }\r\n\r\n public async hookErrorInputNotFoundPage(ctx: Ctx) {\r\n // must be override\r\n return\r\n }\r\n\r\n public async onMessage(ct: Context, listenerName: string): Promise<void> {\r\n const ctx = this.initCtx(ct)\r\n try {\r\n const before = await this.hookBeforeRoute(ctx, listenerName)\r\n if (before === false) {\r\n return\r\n }\r\n\r\n const route = await this.pageRoutes(ctx, listenerName as any)\r\n if (route === null) {\r\n await this.hookErrorInputNotFoundPage(ctx)\r\n }\r\n } catch (error) {\r\n await this.hookErrorPage(ctx, listenerName, error, false)\r\n }\r\n }\r\n\r\n public async onCallbackQueryData(ct: Context): Promise<void> {\r\n const ctx = this.initCtx(ct)\r\n try {\r\n // answer callback query first for fast response\r\n await ctx.callbackQueryAnswer()\r\n const before = await this.hookBeforeRoute(ctx, `onCallbackQueryData`)\r\n if (before === false) {\r\n return\r\n }\r\n\r\n // Check all route\r\n await this.pageRoutes(ctx, `callback`)\r\n } catch (error) {\r\n await this.hookErrorPage(ctx, `onCallbackQueryData`, error, true)\r\n }\r\n }\r\n\r\n public async onMessageText(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageText`)\r\n }\r\n\r\n public async onMessagePhoto(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessagePhoto`)\r\n }\r\n\r\n public async onMessageVideo(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageVideo`)\r\n }\r\n\r\n public async onMessageAudio(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageAudio`)\r\n }\r\n\r\n public async onMessageDocument(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageDocument`)\r\n }\r\n\r\n public async onMessageAnimation(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageAnimation`)\r\n }\r\n\r\n public async onMessageVoice(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageVoice`)\r\n }\r\n\r\n public async onMessageVideoNote(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageVideoNote`)\r\n }\r\n\r\n public async onMessageSticker(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageSticker`)\r\n }\r\n\r\n public async onMessageLocation(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageLocation`)\r\n }\r\n\r\n public async onMessageContact(ct: Context): Promise<void> {\r\n await this.onMessage(ct, `onMessageContact`)\r\n }\r\n}\r\n","export class TemplateEngine {\r\n public static _escape(str: string): string {\r\n return str\r\n .replace(/\\\\/g, `\\\\\\\\`) // escape backslash: \\ → \\\\\r\n .replace(/`/g, `\\\\\\``) // escape backtick: ` → \\`\r\n }\r\n\r\n public static _processVariables(template: string) {\r\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => `\\${(data && data[\"${key}\"]) ?? \"\"}`)\r\n }\r\n\r\n public static _processBaseBlocks(template: string) {\r\n const baseRegex = /<base\\b[^>]*?(?:\\sid=([\"']?)([^\"'\\s>]+)\\1)?[^>]*?>([\\s\\S]*?)<\\/base>/g\r\n const result: {\r\n [baseId: string]: string\r\n } = {}\r\n\r\n for (const match of template.matchAll(baseRegex)) {\r\n const idValue = match[2] ?? `default`\r\n const inner = match[3] ?? ``\r\n const cleaned = inner\r\n .replace(/^[\\t ]+/gm, ``)\r\n .replace(/^\\n+/, ``)\r\n .replace(/\\n+$/, ``)\r\n .trim()\r\n\r\n result[idValue] = cleaned\r\n }\r\n return result\r\n }\r\n\r\n public static _processScriptBlocks(template: string) {\r\n return template.replace(/<script\\b[^>]*>([\\s\\S]*?)<\\/script>/gi, (_, rawCode) => {\r\n const innerCode = rawCode.trim()\r\n if (!innerCode) return ``\r\n\r\n return `\\${(() => { if (!data) return ''; try { with(data) { ${innerCode} } } catch(e) { return '' } })()}`\r\n })\r\n }\r\n\r\n public static _processSpaceBlocks(template: string) {\r\n return template.replace(/^[ \\t]*<space\\s*\\/>[ \\t]*$/gim, ``)\r\n }\r\n\r\n public static _processDivBlocks(template: string) {\r\n return template.replace(/<div>([\\s\\S]*?)<\\/div>/gi, (_, inner) => {\r\n const cleaned = inner\r\n .replace(/^[\\t ]+/gm, ``)\r\n .replace(/^\\n+/, ``)\r\n .replace(/\\n+$/, ``)\r\n return cleaned\r\n })\r\n }\r\n\r\n public static _processMessageBlocks(template: string) {\r\n const messageRegex = /<message\\s+lang=\"([^\"]+)\"\\s*>([\\s\\S]*?)<\\/message>/gi\r\n const result: {\r\n [lang: string]: string\r\n } = {}\r\n\r\n for (const [, lang, rawContent] of template.matchAll(messageRegex) as any) {\r\n const cleaned = rawContent\r\n .replace(/^[\\t ]+/gm, ``)\r\n .replace(/^\\n+/, ``)\r\n .replace(/\\n+$/, ``)\r\n .trim()\r\n\r\n result[lang] = cleaned\r\n }\r\n return result\r\n }\r\n\r\n public static _processKeyboardBlocks(template: string) {\r\n const keyboardRegex = /<keyboard\\b[^>]*\\blang=\"([^\"]*)\"[^>]*?(?:\\sfor=\"([^\"]*)\")?[^>]*>([\\s\\S]*?)<\\/keyboard>/gi\r\n const result: {\r\n [lang: string]: {\r\n inline?: string\r\n default?: string\r\n }\r\n } = {}\r\n\r\n for (const [, lang, forAttr, rawContent] of template.matchAll(keyboardRegex) as any) {\r\n const mode = forAttr === `default` ? `default` : `inline`\r\n const cleaned = rawContent.trim()\r\n\r\n if (!result[lang]) {\r\n result[lang] = {}\r\n }\r\n result[lang][mode] = cleaned\r\n }\r\n return result\r\n }\r\n\r\n public static _compileToFunction<T extends boolean>(template: T extends true ? string[] : string, isArray: T): T extends true ? (data?: Record<string, any>) => string[] : (data?: Record<string, any>) => string {\r\n let singleOrCombined: string\r\n if (isArray) {\r\n const multiTemplate = template as string[]\r\n singleOrCombined = multiTemplate.map((t) => `\\`${t}\\``).join(`,`)\r\n } else {\r\n singleOrCombined = `\\`${template as string}\\``\r\n }\r\n\r\n let processed = singleOrCombined\r\n processed = this._processScriptBlocks(this._processDivBlocks(this._processSpaceBlocks(processed)))\r\n\r\n if (isArray) {\r\n const functionBody = `return [${processed}]`\r\n return new Function(`data`, functionBody) as any\r\n } else {\r\n const functionBody = `return ${processed}`\r\n return new Function(`data`, functionBody) as any\r\n }\r\n }\r\n\r\n public static compileMessages(template: string) {\r\n const baseBlocks = this._processBaseBlocks(template)\r\n const result: {\r\n [baseId: string]: {\r\n [lang: string]: (data?: Record<string, any>) => string\r\n }\r\n } = {}\r\n\r\n for (const [baseId, baseContent] of Object.entries(baseBlocks)) {\r\n const messages = this._processMessageBlocks(baseContent)\r\n result[baseId] = {}\r\n\r\n for (const [lang, content] of Object.entries(messages)) {\r\n const processed = this._processVariables(this._processScriptBlocks(content))\r\n result[baseId][lang] = this._compileToFunction(processed, false)\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n public static compileKeyboards(template: string) {\r\n const baseBlocks = this._processBaseBlocks(template)\r\n const result: {\r\n [baseId: string]: {\r\n [lang: string]: {\r\n inline?: (data?: Record<string, any>) => string[]\r\n default?: (data?: Record<string, any>) => string[]\r\n }\r\n }\r\n } = {}\r\n\r\n for (const [baseId, baseContent] of Object.entries(baseBlocks)) {\r\n const keyboards = this._processKeyboardBlocks(baseContent)\r\n result[baseId] = {}\r\n\r\n for (const [lang, modes] of Object.entries(keyboards)) {\r\n result[baseId][lang] = {}\r\n\r\n for (const [mode, content] of Object.entries(modes)) {\r\n // Pisahkan label, handle escaped comma\r\n const labels = content.split(/(?<!\\\\),\\s*/).map((label: string) => label.replace(/\\\\,/g, `,`).trim())\r\n\r\n const processedLabels = labels.map((label) => this._processVariables(this._processScriptBlocks(label)))\r\n\r\n result[baseId][lang][mode as `inline` | `default`] = this._compileToFunction(processedLabels, true)\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }\r\n}\r\n","import { TemplateEngine } from \".\"\r\nimport { readFile, mkdir } from \"node:fs/promises\"\r\nimport { watch, FSWatcher } from \"chokidar\"\r\nimport { basename, join, extname } from \"node:path\"\r\nimport { readdirSync, readFileSync, existsSync, statSync, writeFileSync } from \"node:fs\"\r\n\r\n/** Template file interface for better type safety */\r\ntype ICompiledTemplate = {\r\n message: ReturnType<typeof TemplateEngine.compileMessages>\r\n keyboard: ReturnType<typeof TemplateEngine.compileKeyboards>\r\n}\r\n\r\n/** Template loading options */\r\ntype ITemplateOptions = {\r\n /** Enable file watching for hot reloading (if have templatePath) */\r\n enableWatch?: boolean\r\n /** Base path for template files (set null if dont want read template from file) */\r\n path?: string | undefined | null\r\n /** Force language params to this value */\r\n forceLanguage?: string | undefined | null\r\n}\r\n\r\n/** Template management system */\r\nexport class TemplateManager {\r\n public _map = new Map<string, ICompiledTemplate>()\r\n public _engine = TemplateEngine\r\n public _watcher: FSWatcher | null = null\r\n public _supportedExtensions = new Set([`.html`])\r\n public readonly _path: string | null\r\n public readonly _forceLanguage: string | null\r\n public readonly _isWatchEnabled: boolean\r\n public constructor(options: ITemplateOptions = {}) {\r\n const { enableWatch = false, path = null, forceLanguage = null } = options\r\n\r\n this._path = path\r\n this._forceLanguage = forceLanguage\r\n this._isWatchEnabled = enableWatch\r\n\r\n this._validatePath()\r\n this._initializeWatcher()\r\n this._loadAllFiles()\r\n }\r\n\r\n /** Validate and ensure template directory exists. @returns Void */\r\n public _validatePath(): void {\r\n try {\r\n if (this._path === null || !existsSync(this._path)) {\r\n return\r\n }\r\n\r\n const stats = statSync(this._path)\r\n if (!stats.isDirectory()) {\r\n throw new Error(`Template path is not a directory: ${this._path}`)\r\n }\r\n } catch (error) {\r\n throw new Error(`Failed to validate Template path: ${error}`)\r\n }\r\n }\r\n\r\n /** Initialize file system watcher for hot reloading. @returns Void */\r\n public _initializeWatcher(): void {\r\n if (this._path === null || !this._isWatchEnabled) {\r\n return\r\n }\r\n\r\n this._watcher = watch(this._path, {\r\n persistent: true,\r\n ignoreInitial: true,\r\n awaitWriteFinish: {\r\n stabilityThreshold: 100,\r\n pollInterval: 50\r\n }\r\n })\r\n\r\n this._watcher!.on(`change`, this._handleFileChange.bind(this))\r\n this._watcher!.on(`add`, this._handleFileAdd.bind(this))\r\n this._watcher!.on(`unlink`, this._handleFileDelete.bind(this))\r\n this._watcher!.on(`error`, this._handleWatchError.bind(this))\r\n }\r\n\r\n /** Handle file change events */\r\n public async _handleFileChange(filepath: string): Promise<void> {\r\n const filename = basename(filepath)\r\n if (this._isValidFile(filename)) {\r\n await this._loadFile(filename, false)\r\n }\r\n }\r\n\r\n /** Handle file add events */\r\n public async _handleFileAdd(filePath: string): Promise<void> {\r\n const fileName = basename(filePath)\r\n if (this._isValidFile(fileName)) {\r\n await this._loadFile(fileName, false)\r\n }\r\n }\r\n\r\n /** Handle file delete events */\r\n public _handleFileDelete(filePath: string): void {\r\n const fileName = basename(filePath)\r\n const fileKey = this._getKey(fileName)\r\n if (this._map.has(fileKey)) {\r\n this._map.delete(fileKey)\r\n }\r\n }\r\n\r\n /** Handle watcher errors */\r\n public _handleWatchError(error: any): void {\r\n // you can overrides\r\n }\r\n\r\n /** Load all Template files during initialization */\r\n public _loadAllFiles(): void {\r\n if (this._path === null || !existsSync(this._path)) {\r\n return\r\n }\r\n const files = readdirSync(this._path, { encoding: `utf8` })\r\n const validFiles = files.filter((file) => this._isValidFile(file))\r\n for (const fileName of validFiles) {\r\n this._loadFile(fileName, true)\r\n }\r\n }\r\n\r\n /** Load and compile a single template file */\r\n public async _loadFile(filename: string, useSync: boolean = true): Promise<void> {\r\n if (this._path === null) {\r\n return\r\n }\r\n const path = join(this._path, filename)\r\n const key = this._getKey(filename)\r\n const raw = useSync ? readFileSync(path, { encoding: `utf8` }) : await readFile(path, { encoding: `utf8` })\r\n this.compile(key, raw)\r\n }\r\n\r\n public _isValidFile(filename: string): boolean {\r\n const extension = extname(filename).toLowerCase()\r\n return this._supportedExtensions.has(extension)\r\n }\r\n\r\n public _getKey(filename: string): string {\r\n return filename.replace(/\\.[^/.]+$/, ``)\r\n }\r\n\r\n public compile(key: string, rawTemplate: string, keepIfExist?: Partial<{ [K in keyof ICompiledTemplate]: boolean }>) {\r\n const existing = this._map.get(key)\r\n const compiled = existing || ({} as ICompiledTemplate)\r\n let updated = false\r\n\r\n if (keepIfExist === undefined || keepIfExist?.message === false || existing?.message === undefined) {\r\n compiled.message = TemplateEngine.compileMessages(rawTemplate)\r\n updated = true\r\n }\r\n if (keepIfExist === undefined || keepIfExist?.keyboard === false || existing?.keyboard === undefined) {\r\n compiled.keyboard = TemplateEngine.compileKeyboards(rawTemplate)\r\n updated = true\r\n }\r\n\r\n if (updated) {\r\n this._map.set(key, compiled)\r\n }\r\n }\r\n\r\n /**\r\n * Get compiled message template\r\n * @param key Template identifier (filename without extension)\r\n * @param baseId Base id attr from block\r\n * @param language Target language code\r\n * @param data Template variables\r\n * @returns Rendered message string\r\n */\r\n public getMessage(key: string, baseId: string = `default`, language: string = `en`, data?: Record<string, any>): string {\r\n const template = this._map.get(key)\r\n const func = template?.message?.[baseId]?.[this._forceLanguage || language]\r\n if (!func) {\r\n return ``\r\n }\r\n\r\n try {\r\n return func(data)\r\n } catch (error) {\r\n return ``\r\n }\r\n }\r\n\r\n /**\r\n * Get compiled keyboard template\r\n * @param key Template identifier (filename without extension)\r\n * @param baseId Base id attr from block\r\n * @param language Target language code\r\n * @param data Template variables\r\n * @returns Array of rendered button labels\r\n */\r\n public getKeyboard(key: string, baseId: string = `default`, language: string = `en`, display: `inline` | `default` = `inline`, data?: Record<string, any>): string[] {\r\n const template = this._map.get(key)\r\n const func = template?.keyboard?.[baseId]?.[this._forceLanguage || language]?.[display]\r\n if (!func) {\r\n return []\r\n }\r\n\r\n try {\r\n return func(data)\r\n } catch (error) {\r\n return []\r\n }\r\n }\r\n\r\n /**\r\n * Update message template in memory\r\n * @param key Template identifier (filename without extension)\r\n * @param rawTemplate Raw template string\r\n */\r\n public setMessage(key: string, rawTemplate: string): void {\r\n this.compile(key, rawTemplate, { keyboard: true })\r\n }\r\n\r\n /**\r\n * Update keyboard template in memory\r\n * @param key Template identifier (filename without extension)\r\n * @param rawTemplate Raw template string\r\n */\r\n public setKeyboard(key: string, rawTemplate: string): void {\r\n this.compile(key, rawTemplate, { message: true })\r\n }\r\n\r\n /**\r\n * Write template to file and update cache\r\n * @param filename Target filename (with extension)\r\n * @param rawTemplate Template to write\r\n * @returns Promise that resolves when file is written\r\n */\r\n public async write(filename: string, rawTemplate: string): Promise<void> {\r\n if (this._path === null) {\r\n return\r\n }\r\n const filePath = join(this._path, filename)\r\n await mkdir(this._path, { recursive: true })\r\n writeFileSync(filePath, rawTemplate, { encoding: `utf8` })\r\n await this._loadFile(filename, false)\r\n }\r\n\r\n /**\r\n * Get list of available template\r\n * @returns Array of template names\r\n */\r\n public getAvailable(): string[] {\r\n return Array.from(this._map.keys())\r\n }\r\n\r\n /**\r\n * Check if template exists\r\n * @param key Template identifier\r\n * @returns True if template exists\r\n */\r\n public has(key: string): boolean {\r\n return this._map.has(key)\r\n }\r\n\r\n /**\r\n * Get cache statistics\r\n * @returns Object with cache information\r\n */\r\n public getCacheStats(): { templateCount: number; totalSize: number } {\r\n return {\r\n templateCount: this._map.size,\r\n totalSize: JSON.stringify(this._map.entries().toArray(), (_, value) => {\r\n return typeof value === `function` ? value.toString() : value\r\n }).length\r\n }\r\n }\r\n\r\n /**\r\n * Cleanup resources and close watchers\r\n * @returns Promise void\r\n */\r\n public async destroy(): Promise<void> {\r\n if (this._watcher) {\r\n await this._watcher.close()\r\n }\r\n this._map.clear()\r\n }\r\n}\r\n"],"mappings":"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","names":["LoggingPretty","BaseGeneral","__name","LoggingPretty","error","func","constructorName","funcName","Keyv","KeyvRedis","CacheExternal","Keyv","url","namespace","ttl","more","store","KeyvRedis","__name","setTimeout","InlineKeyboard","Keyboard","Ctx","BaseGeneral","__name","v","params","ids","languageCode","keyboard","data","baseId","options","msgs","it","index","id","msg","setTimeout","type","method","moreRoot","value","result","callback","args","tkey","key","ckb","ikb","InlineKeyboard","arr","rkb","kb","Keyboard","name","paramsAdd","str","fbCallbackData","tag","prefix","serve","join","parse","LoggingPretty","TemplateEngine","__name","str","template","_","key","baseRegex","result","match","idValue","cleaned","rawCode","innerCode","inner","messageRegex","lang","rawContent","keyboardRegex","forAttr","mode","isArray","singleOrCombined","t","processed","functionBody","baseBlocks","baseId","baseContent","messages","content","keyboards","modes","processedLabels","label","readFile","mkdir","watch","basename","join","extname","readdirSync","readFileSync","existsSync","statSync","writeFileSync","TemplateManager","__name","TemplateEngine","options","enableWatch","path","forceLanguage","existsSync","statSync","error","watch","filepath","filename","basename","filePath","fileName","fileKey","validFiles","readdirSync","file","useSync","join","key","raw","readFileSync","readFile","extension","extname","rawTemplate","keepIfExist","existing","compiled","updated","baseId","language","data","func","display","mkdir","writeFileSync","_","value","existsSync","readdirSync","Bot","webhookCallback","Gramstax","__name","params","LoggingPretty","CacheExternal","TemplateManager","Bot","error","botInfo","method","data","username","ct","Ctx","baseUrl","handleUpdate","webhookCallback","pathWebhook","serve","req","pathname","timestamp","webhookUrl","Page","redacted","filePath","parse","pages","name","proto","partPayload","partCommand","partCaption","partFree","pd","pds","upFirst","s","getPureFuncName","func","buildSessionMethod","index","ps","psi","pss","value","p","_name","path","join","existsSync","files","readdirSync","initStatic","initStaticIntent","initStaticSession","initDynamicSpesific","listFuncStatic","listFuncStaticIntent","listFuncStaticSession","makeObject","keys","val","k","file","module","__require","ctx","fromListener","res","cd","mt","mc","funcName","session","mtd","cdi","mti","mci","arrFree","initRoute","listenerName","isEdit"]}