index.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /**
  2. * Cron Manager Plugin v1.1.0
  3. * Schedules delayed tasks and sends results back to the original conversation.
  4. */
  5. var JOBS_KEY = 'cron_jobs';
  6. // Initialize state with jobs from storage (if any)
  7. var storedJobs = shadowman.storage.get(JOBS_KEY);
  8. if (!storedJobs) storedJobs = [];
  9. shadowman.state.set(JOBS_KEY, storedJobs);
  10. // --- Tools ---
  11. shadowman.tools.register('schedule_job', function(args) {
  12. var schedule = args.schedule;
  13. var instructions = args.instructions;
  14. var conversationId = args.conversationId;
  15. var jobs = shadowman.state.get(JOBS_KEY) || [];
  16. var jobId = 'job_' + Math.random().toString(36).substr(2, 9);
  17. var triggerTime = null;
  18. var intervalMs = null;
  19. // Parser: number = minutes interval, string = ISO timestamp
  20. if (!isNaN(schedule)) {
  21. intervalMs = parseInt(schedule) * 60 * 1000;
  22. } else {
  23. var date = new Date(schedule);
  24. if (!isNaN(date.getTime())) {
  25. triggerTime = date.getTime();
  26. } else {
  27. return { error: "Invalid schedule format. Use an ISO timestamp or a number of minutes for intervals." };
  28. }
  29. }
  30. var job = {
  31. id: jobId,
  32. schedule: schedule,
  33. instructions: instructions,
  34. conversationId: conversationId,
  35. triggerTime: triggerTime,
  36. intervalMs: intervalMs,
  37. lastRun: 0,
  38. createdAt: Date.now()
  39. };
  40. jobs.push(job);
  41. shadowman.storage.set(JOBS_KEY, jobs);
  42. shadowman.state.set(JOBS_KEY, jobs);
  43. return {
  44. status: "success",
  45. jobId: jobId,
  46. message: "Job scheduled. It will trigger at " + schedule + " and notify conversation " + conversationId + "."
  47. };
  48. });
  49. shadowman.tools.register('list_jobs', function() {
  50. var jobs = shadowman.state.get(JOBS_KEY) || [];
  51. return { jobs: jobs };
  52. });
  53. shadowman.tools.register('cancel_job', function(args) {
  54. var jobId = args.jobId;
  55. var jobs = shadowman.state.get(JOBS_KEY) || [];
  56. var filtered = [];
  57. for (var i = 0; i < jobs.length; i++) {
  58. if (jobs[i].id !== jobId) {
  59. filtered.push(jobs[i]);
  60. }
  61. }
  62. if (jobs.length === filtered.length) {
  63. return { error: "Job not found." };
  64. }
  65. shadowman.storage.set(JOBS_KEY, filtered);
  66. shadowman.state.set(JOBS_KEY, filtered);
  67. return { status: "success", message: "Job " + jobId + " cancelled." };
  68. });
  69. // --- Background Worker ---
  70. shadowman.background.run(function() {
  71. var JOBS_KEY = 'cron_jobs';
  72. shadowman.log.info("Cron Manager worker started");
  73. while (true) {
  74. try {
  75. var jobs = shadowman.state.get(JOBS_KEY);
  76. if (jobs && jobs.length > 0) {
  77. var currentTime = Date.now();
  78. var jobsToTrigger = [];
  79. var jobsToRemove = [];
  80. for (var i = 0; i < jobs.length; i++) {
  81. var job = jobs[i];
  82. if (job.triggerTime && currentTime >= job.triggerTime) {
  83. jobsToTrigger.push(job);
  84. jobsToRemove.push(job.id);
  85. } else if (job.intervalMs && (currentTime - job.lastRun) >= job.intervalMs) {
  86. jobsToTrigger.push(job);
  87. }
  88. }
  89. for (var i = 0; i < jobsToTrigger.length; i++) {
  90. var job = jobsToTrigger[i];
  91. shadowman.log.info("Triggering cron job " + job.id);
  92. shadowman.events.emit('message', {
  93. text: "⏰ **Cron Job Triggered**\n\n**Instructions:** " + job.instructions + "\n\n*This is an automated notification from Cron Manager.*",
  94. conversationId: job.conversationId,
  95. platform: 'CronManager',
  96. sender: 'Cron Manager'
  97. });
  98. if (job.intervalMs) {
  99. job.lastRun = currentTime;
  100. }
  101. }
  102. if (jobsToRemove.length > 0) {
  103. var remainingJobs = [];
  104. for (var i = 0; i < jobs.length; i++) {
  105. if (jobsToRemove.indexOf(jobs[i].id) === -1) {
  106. remainingJobs.push(jobs[i]);
  107. }
  108. }
  109. shadowman.state.set(JOBS_KEY, remainingJobs);
  110. }
  111. }
  112. shadowman.utils.sleep(10000);
  113. } catch (e) {
  114. shadowman.log.error("Cron worker error: " + e.toString());
  115. shadowman.utils.sleep(5000);
  116. }
  117. }
  118. });
  119. shadowman.log.info("Cron Manager plugin v1.1.0 ready");