Skip to content

Commit 7fa1ddd

Browse files
authored
Merge branch 'SciSharp:master' into master
2 parents 90af5e3 + d0b9ea9 commit 7fa1ddd

File tree

11 files changed

+592
-359
lines changed

11 files changed

+592
-359
lines changed

src/Infrastructure/BotSharp.Abstraction/Crontab/Models/CrontabItem.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,17 @@ public class CrontabItem : ScheduleTaskArgs
2929
[JsonPropertyName("created_time")]
3030
public DateTime CreatedTime { get; set; } = DateTime.UtcNow;
3131

32+
[JsonPropertyName("trigger_type")]
33+
public CronTabItemTriggerType TriggerType { get; set; } = CronTabItemTriggerType.BackgroundWatcher;
34+
3235
public override string ToString()
3336
{
3437
return $"{Title}: {Description} [AgentId: {AgentId}, UserId: {UserId}]";
3538
}
3639
}
40+
41+
public enum CronTabItemTriggerType
42+
{
43+
BackgroundWatcher,
44+
OpenAPI
45+
}

src/Infrastructure/BotSharp.Abstraction/Loggers/Models/InstructionLogModel.cs

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,56 @@
22

33
namespace BotSharp.Abstraction.Loggers.Models;
44

5-
public class InstructionLogModel
5+
public class InstructionLogModel : InstructionLogBaseModel
6+
{
7+
public Dictionary<string, string> States { get; set; } = [];
8+
9+
public static InstructionLogModel From(InstructionFileLogModel log)
10+
{
11+
return new InstructionLogModel
12+
{
13+
Id = log.Id,
14+
AgentId = log.AgentId,
15+
AgentName = log.AgentName,
16+
Provider = log.Provider,
17+
Model = log.Model,
18+
TemplateName = log.TemplateName,
19+
UserMessage = log.UserMessage,
20+
SystemInstruction = log.SystemInstruction,
21+
CompletionText = log.CompletionText,
22+
UserId = log.UserId,
23+
UserName = log.UserName,
24+
CreatedTime = log.CreatedTime
25+
};
26+
}
27+
}
28+
29+
public class InstructionFileLogModel : InstructionLogBaseModel
30+
{
31+
[JsonPropertyName("states")]
32+
public Dictionary<string, JsonDocument> States { get; set; } = [];
33+
34+
public static InstructionFileLogModel From(InstructionLogModel log)
35+
{
36+
return new InstructionFileLogModel
37+
{
38+
Id = log.Id,
39+
AgentId = log.AgentId,
40+
AgentName = log.AgentName,
41+
Provider = log.Provider,
42+
Model = log.Model,
43+
TemplateName = log.TemplateName,
44+
UserMessage = log.UserMessage,
45+
SystemInstruction = log.SystemInstruction,
46+
CompletionText = log.CompletionText,
47+
UserId = log.UserId,
48+
UserName = log.UserName,
49+
CreatedTime = log.CreatedTime
50+
};
51+
}
52+
}
53+
54+
public class InstructionLogBaseModel
655
{
756
[JsonPropertyName("id")]
857
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
@@ -43,12 +92,6 @@ public class InstructionLogModel
4392
[JsonIgnore]
4493
public string? UserName { get; set; }
4594

46-
[JsonIgnore]
47-
public Dictionary<string, string> States { get; set; } = [];
48-
49-
[JsonPropertyName("states")]
50-
public Dictionary<string, JsonDocument> InnerStates { get; set; } = [];
51-
5295
[JsonPropertyName("created_time")]
5396
public DateTime CreatedTime { get; set; } = DateTime.UtcNow;
5497
}
Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,8 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
1+
namespace BotSharp.Abstraction.Repositories.Models;
62

7-
namespace BotSharp.Abstraction.Repositories.Models
3+
public class UpdateInstructionLogStatesModel
84
{
9-
public class UpdateInstructionLogStatesModel
10-
{
11-
public string LogId { get; set; }
12-
public string StateKeyPrefix { get; set; } = "new_";
13-
public Dictionary<string, string> States { get; set; }
14-
}
5+
public string LogId { get; set; } = default!;
6+
public string StateKeyPrefix { get; set; } = "new_";
7+
public Dictionary<string, string> States { get; set; } = [];
158
}

src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabEventSubscription.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
2929
var subscriber = scope.ServiceProvider.GetRequiredService<IEventSubscriber>();
3030
var cron = scope.ServiceProvider.GetRequiredService<ICrontabService>();
3131
var crons = await cron.GetCrontable();
32-
foreach (var item in crons)
32+
var allowedCrons = crons.Where(cron => cron.TriggerType == CronTabItemTriggerType.BackgroundWatcher).ToList();
33+
foreach (var item in allowedCrons)
3334
{
3435
_ = Task.Run(async () =>
3536
{
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using NCrontab;
2+
3+
namespace BotSharp.Core.Crontab.Services
4+
{
5+
public static class CrontabItemExtension
6+
{
7+
public static bool CheckNextOccurrenceEveryOneMinute(this CrontabItem item)
8+
{
9+
// strip seconds from cron expression
10+
item.Cron = string.Join(" ", item.Cron.Split(' ').TakeLast(5));
11+
var schedule = CrontabSchedule.Parse(item.Cron, new CrontabSchedule.ParseOptions
12+
{
13+
IncludingSeconds = false // Ensure you account for seconds
14+
});
15+
16+
var currentTime = DateTime.UtcNow;
17+
var currentMinute = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day,
18+
currentTime.Hour, currentTime.Minute, 0, DateTimeKind.Utc);
19+
20+
var oneMinuteAgo = currentMinute.AddMinutes(-1);
21+
var nextOccurrence = schedule.GetNextOccurrence(oneMinuteAgo);
22+
23+
return nextOccurrence == currentMinute;
24+
}
25+
}
26+
}

src/Infrastructure/BotSharp.Core.Crontab/Services/CrontabWatcher.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ private async Task RunCronChecker(IServiceProvider services)
5858
{
5959
var cron = services.GetRequiredService<ICrontabService>();
6060
var crons = await cron.GetCrontable();
61+
var allowedCrons = crons.Where(cron => cron.TriggerType == CronTabItemTriggerType.BackgroundWatcher).ToList();
6162
var settings = services.GetRequiredService<CrontabSettings>();
6263
var publisher = services.GetService<IEventPublisher>();
6364

64-
foreach (var item in crons)
65+
foreach (var item in allowedCrons)
6566
{
6667
_logger.LogDebug($"[{DateTime.UtcNow}] Cron task ({item.Title}, {item.Cron}), Last Execution Time: {item.LastExecutionTime}");
6768

0 commit comments

Comments
 (0)