Files
obsidian-notif/main.js
T

10 lines
24 KiB
JavaScript
Raw Normal View History

2026-06-27 15:05:31 +08:00
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
*/
var V=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var tt=(o,e)=>{for(var t in e)V(o,t,{get:e[t],enumerable:!0})},et=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Q(e))!Z.call(o,s)&&s!==t&&V(o,s,{get:()=>e[s],enumerable:!(n=X(e,s))||n.enumerable});return o};var it=o=>et(V({},"__esModule",{value:!0}),o);var ot={};tt(ot,{default:()=>M});module.exports=it(ot);var m=require("obsidian");var b=require("obsidian");var nt=new Map([["sunday",0],["monday",1],["tuesday",2],["wednesday",3],["thursday",4],["friday",5],["saturday",6]]);function D(o,e=new Date){var a,c,p,w,y,T;let t=o.trim();if(!t)return null;let n=t.match(/^\+(\d+)\s*(m|min|minute|minutes|h|hour|hours|d|day|days)$/i);if(n){let h=Number(n[1]),g=n[2].toLowerCase(),P=g.startsWith("m")?h*6e4:g.startsWith("h")?h*36e5:h*864e5;return new Date(e.getTime()+P)}let s=t.match(/^tomorrow(?:\s+(\d{1,2})(?::(\d{2}))?)?$/i);if(s){let h=new Date(e);return h.setDate(h.getDate()+1),h.setHours(Number((a=s[1])!=null?a:9),Number((c=s[2])!=null?c:0),0,0),h}let i=t.match(/^next\s+(sunday|monday|tuesday|wednesday|thursday|friday|saturday)(?:\s+(\d{1,2})(?::(\d{2}))?)?$/i);if(i){let h=nt.get(i[1].toLowerCase());if(h===void 0)return null;let g=new Date(e),P=h-g.getDay()+7||7;return g.setDate(g.getDate()+P),g.setHours(Number((p=i[2])!=null?p:9),Number((w=i[3])!=null?w:0),0,0),g}let r=t.match(/^(\d{4}-\d{2}-\d{2})(?:[ T](\d{1,2})(?::(\d{2}))?)?$/);if(r){let h=(y=r[2])!=null?y:"9",g=(T=r[3])!=null?T:"0",P=new Date(`${r[1]}T${h.padStart(2,"0")}:${g.padStart(2,"0")}:00`);return Number.isNaN(P.getTime())?null:P}let d=new Date(t);return Number.isNaN(d.getTime())?null:d}function j(o){let e=new Date(o);return Number.isNaN(e.getTime())?o:e.toLocaleString()}var v=class extends b.Modal{constructor(t,n,s=!1){super(t);this.store=n;this.showCompleted=s}onOpen(){this.render()}render(){let{contentEl:t}=this;t.empty(),t.createEl("h2",{text:this.showCompleted?"All reminders":"Active reminders"}),new b.Setting(t).addButton(i=>i.setButtonText(this.showCompleted?"Show active only":"Show all").onClick(()=>{this.showCompleted=!this.showCompleted,this.render()}));let n=this.showCompleted?this.store.getAll():this.store.getAll().filter(i=>!i.completed&&i.status!=="cancelled"&&i.status!=="sent"&&i.status!=="done");if(!n.length){t.createEl("p",{text:this.showCompleted?"No reminders.":"No active reminders."});return}let s=t.createDiv({cls:"reminder-notifier-list"});for(let i of n){let r=s.createDiv({cls:"reminder-notifier-item"});r.createDiv({cls:"reminder-notifier-item-title",text:i.title}),r.createDiv({cls:"reminder-notifier-item-meta",text:`${j(i.dueAt)} - ${i.status} - ${i.channels.join(", ")||"all enabled"}`}),i.sourceFile&&r.createDiv({cls:"reminder-notifier-item-meta",text:`${i.sourceFile}${i.sourceLine?`:${i.sourceLine}`:""}`}),i.lastError&&r.createDiv({cls:"reminder-notifier-item-meta",text:`Last error: ${i.lastError}`});let d=r.createDiv({cls:"reminder-notifier-actions"});new b.Setting(d).addButton(a=>a.setButtonText("Snooze 15m").onClick(async()=>{await this.store.snooze(i.id,15),this.render()})).addButton(a=>a.setButtonText("Done").onClick(async()=>{await this.store.complete(i.id),this.render()})).addButton(a=>a.setButtonText("Delete").onClick(async()=>{await this.store.remove(i.id),this.render()}))}}};var f=require("obsidian"),S=class extends f.Modal{constructor(t,n,s,i=""){super(t);this.defaultChannels=n;this.onSubmit=s;this.title="";this.body="";this.year="";this.month="";this.day="";this.hour="";this.minute="";this.channels="";let r=new Date(Date.now()+60*60*1e3);this.title=i,this.body=i,this.channels=n.join(", "),this.year=String(r.getFullYear()),this.month=String(r.getMonth()+1).padStart(2,"0"),this.day=String(r.getDate()).padStart(2,"0"),this.hour=String(r.getHours()).padStart(2,"0"),this.minute=String(Math.ceil(r.getMinutes()/5)*5).padStart(2,"0"),this.minute==="60"&&(this.minute="00",this.hour=String((r.getHours()+1)%24).padStart(2,"0"))}onOpen(){let{contentEl:t}=this;t.empty(),t.createEl("h2
${e.message}`}),throw:!0})}async test(e){await this.send({title:"Obsidian Reminder Notifier",message:"Test notification",dueAt:new Date().toISOString()},e)}};var _=require("obsidian"),I=class{constructor(){this.id="local";this.name="Local Obsidian notice"}async send(e){new _.Notice(`${e.title}
${e.message}`,1e4)}async test(e){new _.Notice("Reminder Notifier test notification",5e3)}};var z=require("obsidian");var E=class{constructor(){this.id="ntfy";this.name="ntfy"}async send(e,t){var a;let n=u(t.config.serverUrl,"https://ntfy.sh").replace(/\/$/,""),s=u(t.config.topic);if(!s)throw new Error("ntfy topic is required.");let i={Title:e.title,Priority:String((a=t.config.priority)!=null?a:st(e.priority))},r=u(t.config.token);r&&(i.Authorization=`Bearer ${r}`);let d=t.config.tags;Array.isArray(d)&&(i.Tags=d.join(",")),await(0,z.requestUrl)({url:`${n}/${encodeURIComponent(s)}`,method:"POST",headers:i,body:e.message,throw:!0})}async test(e){await this.send({title:"Obsidian Reminder Notifier",message:"Test notification",dueAt:new Date().toISOString()},e)}};function st(o="normal"){return o==="high"?4:o==="low"?2:3}var H=require("obsidian");var $=class{constructor(){this.id="telegram";this.name="Telegram"}async send(e,t){let n=u(t.config.botToken),s=u(t.config.chatId);if(!n||!s)throw new Error("Telegram botToken and chatId are required.");let i=`*${e.title}*
${e.message}`;await(0,H.requestUrl)({url:`https://api.telegram.org/bot${n}/sendMessage`,method:"POST",contentType:"application/json",body:JSON.stringify({chat_id:s,text:i,parse_mode:u(t.config.parseMode,"Markdown"),disable_web_page_preview:!0}),throw:!0})}async test(e){await this.send({title:"Obsidian Reminder Notifier",message:"Test notification",dueAt:new Date().toISOString()},e)}};var K=require("obsidian");var F=class{constructor(){this.id="webhook";this.name="Generic webhook"}async send(e,t){var d,a;let n=u(t.config.url);if(!n)throw new Error("Webhook URL is required.");let s=u(t.config.method,"POST").toUpperCase();if(!["POST","PUT","PATCH"].includes(s))throw new Error("Webhook method must be POST, PUT, or PATCH.");let i=C((d=t.config.headers)!=null?d:{"Content-Type":"application/json"},e),r=C((a=t.config.bodyTemplate)!=null?a:{title:"{{title}}",message:"{{message}}",dueAt:"{{dueAt}}",sourceFile:"{{sourceFile}}"},e);await(0,K.requestUrl)({url:n,method:s,headers:i,body:typeof r=="string"?r:JSON.stringify(r),throw:!0})}async test(e){await this.send({title:"Obsidian Reminder Notifier",message:"Test notification",dueAt:new Date().toISOString()},e)}};function G(){let o=[new I,new $,new E,new F,new O];return new Map(o.map(e=>[e.id,e]))}var M=class extends m.Plugin{constructor(){super(...arguments);this.providers=G()}async onload(){if(this.store=new A(this),await this.store.load(),this.scheduler=new k(this.app.vault,this.store,this.providers),this.addSettingTab(new x(this.app,this)),this.registerCommands(),this.registerRibbonActions(),this.registerContextMenus(),this.registerFileWatcher(),this.store.getSettings().scanVaultOnStartup){let t=await this.scheduler.scanVault();t>0&&new m.Notice(`Reminder Notifier indexed ${t} reminders.`)}this.scheduler.start()}onunload(){var t;(t=this.scheduler)==null||t.stop()}restartScheduler(){this.scheduler.stop(),this.scheduler.start()}async testProvider(t){let n=this.providers.get(t.type);if(!n)throw new Error(`Unknown provider: ${t.type}`);await n.test(t)}registerCommands(){this.addCommand({id:"create-reminder",name:"Create reminder",callback:()=>{new S(this.app,this.store.getSettings().defaultChannels,async t=>{await this.store.add(t,this.store.getSettings().defaultChannels),new m.Notice("Reminder created.")}).open()}}),this.addCommand({id:"create-reminder-from-selection",name:"Create reminder from selected text",editorCallback:t=>{let n=t.getSelection();new S(this.app,this.store.getSettings().defaultChannels,async s=>{await this.store.add(s,this.store.getSettings().defaultChannels),new m.Notice("Reminder created.")},n).open()}}),this.addCommand({id:"show-active-reminders",name:"Show active reminders",callback:()=>{new v(this.app,this.store,!1).open()}}),this.addCommand({id:"show-all-reminders",name:"Show all reminders",callback:()=>{new v(this.app,this.store,!0).open()}}),this.addCommand({id:"scan-current-note",name:"Scan current note for reminders",checkCallback:t=>{let n=this.app.workspace.getActiveFile();return n?(t||this.scanCurrentFile(n),!0):!1}}),this.addCommand({id:"scan-vault",name:"Scan vault for reminders",callback:async()=>{let t=await this.scheduler.scanVault();new m.Notice(`Indexed ${t} reminders.`)}}),this.addCommand({id:"test-notification-providers",name:"Test notification providers",callback:async()=>{let t=this.store.getSettings().notificationProviders.filter(n=>n.enabled);for(let n of t)await this.testProvider(n);new m.Notice(`Tested ${t.length} providers.`)}})}registerRibbonActions(){this.addRibbonIcon("bell-plus","Create reminder",()=>{new S(this.app,this.store.getSettings().defaultChannels,async t=>{await this.store.add(t,this.store.getSettings().defaultChannels),new m.Notice("Reminder created.")}).open()}),this.addRibbonIcon("list-checks","Show reminders",()=>{new v(this.app,this.store,!0).open()})}registerContextMenus(){this.registerEvent(this.app.workspace.on("editor-menu",(t,n)=>{t.addSeparator(),t.addItem(s=>s.setTitle("Create reminder").setIcon("bell-plus").onClick(()=>{let i=n.getSelection();new S(this.app,this.store.getSettings().defaultChannels,async r=>{