2025-01-08 20:49:15 +00:00
using BotSharp.Abstraction.Conversations ;
using BotSharp.Abstraction.Models ;
using BotSharp.Abstraction.Repositories.Filters ;
using BotSharp.Abstraction.Utilities ;
using Microsoft.Extensions.Logging ;
using System.Data ;
2025-01-02 21:29:30 +00:00
namespace BotSharp.Core.Rules.Engines ;
public class RuleEngine : IRuleEngine
{
private readonly IServiceProvider _services ;
2025-01-08 20:49:15 +00:00
private readonly ILogger _logger ;
public RuleEngine ( IServiceProvider services , ILogger < RuleEngine > logger )
2025-01-02 21:29:30 +00:00
{
_services = services ;
2025-01-08 20:49:15 +00:00
_logger = logger ;
2025-01-02 21:29:30 +00:00
}
2025-04-23 06:35:05 +00:00
public async Task < IEnumerable < string > > Triggered ( IRuleTrigger trigger , string data , List < MessageState > ? states = null )
2025-01-02 21:29:30 +00:00
{
// Pull all user defined rules
2025-01-08 20:49:15 +00:00
var agentService = _services . GetRequiredService < IAgentService > ( ) ;
var agents = await agentService . GetAgents ( new AgentFilter
{
Pager = new Pagination
{
Size = 1000
}
} ) ;
var preFilteredAgents = agents . Items . Where ( x = >
x . Rules . Exists ( r = > r . TriggerName = = trigger . Name & &
! x . Disabled ) ) . ToList ( ) ;
// Trigger the agents
2025-01-02 21:29:30 +00:00
var instructService = _services . GetRequiredService < IInstructService > ( ) ;
2025-04-23 06:35:05 +00:00
var newConversationIds = new List < string > ( ) ;
2025-01-08 20:49:15 +00:00
foreach ( var agent in preFilteredAgents )
{
2025-01-28 23:00:08 +00:00
var convService = _services . GetRequiredService < IConversationService > ( ) ;
2025-01-08 20:49:15 +00:00
var conv = await convService . NewConversation ( new Conversation
{
2025-01-16 21:57:50 +00:00
Channel = trigger . Channel ,
Title = data ,
2025-01-08 20:49:15 +00:00
AgentId = agent . Id
} ) ;
var message = new RoleDialogModel ( AgentRole . User , data ) ;
2025-01-28 23:00:08 +00:00
var allStates = new List < MessageState >
2025-01-08 20:49:15 +00:00
{
2025-01-28 23:00:08 +00:00
new ( "channel" , trigger . Channel )
2025-01-08 20:49:15 +00:00
} ;
2025-01-28 23:00:08 +00:00
if ( states ! = null )
{
allStates . AddRange ( states ) ;
}
convService . SetConversationId ( conv . Id , allStates ) ;
2025-01-08 20:49:15 +00:00
await convService . SendMessage ( agent . Id ,
message ,
null ,
msg = > Task . CompletedTask ) ;
2025-01-28 23:00:08 +00:00
convService . SaveStates ( ) ;
2025-04-23 06:35:05 +00:00
newConversationIds . Add ( conv . Id ) ;
2025-01-28 23:00:08 +00:00
2025-01-08 20:49:15 +00:00
/ * foreach ( var rule in agent . Rules )
{
var userSay = $"===Input data with Before and After values===\r\n{data}\r\n\r\n===Trigger Criteria===\r\n{rule.Criteria}\r\n\r\nJust output 1 or 0 without explanation: " ;
2025-01-02 21:29:30 +00:00
2025-01-08 20:49:15 +00:00
var result = await instructService . Execute ( BuiltInAgentId . RulesInterpreter , new RoleDialogModel ( AgentRole . User , userSay ) , "criteria_check" , "#TEMPLATE#" ) ;
2025-01-02 21:29:30 +00:00
2025-01-08 20:49:15 +00:00
// Check if meet the criteria
if ( result . Text = = "1" )
{
// Hit rule
_logger . LogInformation ( $"Hit rule {rule.TriggerName} {rule.EntityType} {rule.EventName}, {data}" ) ;
2025-01-02 21:29:30 +00:00
2025-01-08 20:49:15 +00:00
await convService . SendMessage ( agent . Id ,
new RoleDialogModel ( AgentRole . User , $"The conversation was triggered by {rule.Criteria}" ) ,
null ,
msg = > Task . CompletedTask ) ;
}
} * /
}
2025-04-23 06:35:05 +00:00
return newConversationIds ;
2025-01-02 21:29:30 +00:00
}
}