Skip to content

Commit a006f6a

Browse files
authored
Merge pull request #926 from iceljc/master
add instruction log setting and state search
2 parents 6af7a3e + eb81ad2 commit a006f6a

File tree

9 files changed

+136
-13
lines changed

9 files changed

+136
-13
lines changed

src/Infrastructure/BotSharp.Abstraction/Instructs/Models/InstructLogFilter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public class InstructLogFilter : Pagination
77
public List<string>? Models { get; set; }
88
public List<string>? TemplateNames { get; set; }
99
public List<string>? UserIds { get; set; }
10+
public List<KeyValue>? States { get; set; }
1011

1112
public static InstructLogFilter Empty()
1213
{
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace BotSharp.Abstraction.Instructs.Settings;
2+
3+
public class InstructionSettings
4+
{
5+
public bool EnableLog { get; set; }
6+
}

src/Infrastructure/BotSharp.Abstraction/Models/KeyValue.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ namespace BotSharp.Abstraction.Models;
33
public class KeyValue
44
{
55
[JsonPropertyName("key")]
6-
public string Key { get; set; }
6+
public string Key { get; set; } = string.Empty;
77

88
[JsonPropertyName("value")]
9-
public string Value { get; set; }
9+
public string? Value { get; set; }
1010

1111
public override string ToString()
1212
{
@@ -17,7 +17,7 @@ public override string ToString()
1717
public class KeyValue<T>
1818
{
1919
[JsonPropertyName("key")]
20-
public string Key { get; set; }
20+
public string Key { get; set; } = string.Empty;
2121

2222
[JsonPropertyName("value")]
2323
public T? Value { get; set; }

src/Infrastructure/BotSharp.Core/Instructs/InsturctionPlugin.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
using BotSharp.Abstraction.Instructs.Settings;
12
using BotSharp.Abstraction.Plugins.Models;
3+
using BotSharp.Abstraction.Settings;
24
using Microsoft.Extensions.Configuration;
35

46
namespace BotSharp.Core.Instructs;
@@ -11,7 +13,11 @@ public class InsturctionPlugin : IBotSharpPlugin
1113

1214
public void RegisterDI(IServiceCollection services, IConfiguration config)
1315
{
14-
16+
services.AddScoped(provider =>
17+
{
18+
var settingService = provider.GetRequiredService<ISettingService>();
19+
return settingService.Bind<InstructionSettings>("Instruction");
20+
});
1521
}
1622

1723
public bool AttachMenu(List<PluginMenuDef> menu)

src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Log.cs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,66 @@ public PagedItems<InstructionLogModel> GetInstructionLogs(InstructLogFilter filt
187187
matched = matched && filter.UserIds.Contains(log.UserId);
188188
}
189189

190+
// Check states
191+
if (matched && filter != null && !filter.States.IsNullOrEmpty())
192+
{
193+
var logStates = log.InnerStates;
194+
if (logStates.IsNullOrEmpty())
195+
{
196+
matched = false;
197+
}
198+
else
199+
{
200+
foreach (var pair in filter.States)
201+
{
202+
if (pair == null || string.IsNullOrWhiteSpace(pair.Key)) continue;
203+
204+
var components = pair.Key.Split(".").ToList();
205+
var primaryKey = components[0];
206+
if (logStates.TryGetValue(primaryKey, out var doc))
207+
{
208+
var elem = doc.RootElement.GetProperty("data");
209+
if (components.Count < 2)
210+
{
211+
if (!string.IsNullOrWhiteSpace(pair.Value))
212+
{
213+
if (elem.ValueKind == JsonValueKind.Null)
214+
{
215+
matched = false;
216+
}
217+
else if (elem.ValueKind == JsonValueKind.Array)
218+
{
219+
matched = elem.EnumerateArray().Where(x => x.ValueKind != JsonValueKind.Null)
220+
.Select(x => x.ToString())
221+
.Any(x => x == pair.Value);
222+
}
223+
else if (elem.ValueKind == JsonValueKind.String)
224+
{
225+
matched = elem.GetString() == pair.Value;
226+
}
227+
else
228+
{
229+
matched = elem.GetRawText() == pair.Value;
230+
}
231+
}
232+
}
233+
else
234+
{
235+
var paths = components.Where((_, idx) => idx > 0);
236+
var found = FindState(elem, paths, pair.Value);
237+
matched = found != null;
238+
}
239+
}
240+
else
241+
{
242+
matched = false;
243+
}
244+
245+
if (!matched) break;
246+
}
247+
}
248+
}
249+
190250
if (!matched) continue;
191251

192252
log.Id = Path.GetFileNameWithoutExtension(file);

src/Infrastructure/BotSharp.Logger/Hooks/InstructionLogHook.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using BotSharp.Abstraction.Instructs.Models;
2+
using BotSharp.Abstraction.Instructs.Settings;
23
using BotSharp.Abstraction.Loggers.Models;
34
using BotSharp.Abstraction.Users;
45

@@ -24,7 +25,8 @@ public InstructionLogHook(
2425

2526
public override async Task OnResponseGenerated(InstructResponseModel response)
2627
{
27-
if (response == null) return;
28+
var settings = _services.GetRequiredService<InstructionSettings>();
29+
if (!settings.EnableLog || response == null) return;
2830

2931
var db = _services.GetRequiredService<IBotSharpRepository>();
3032
var state = _services.GetRequiredService<IConversationStateService>();

src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ public PagedItems<Conversation> GetConversations(ConversationFilter filter)
383383
}
384384

385385
// Filter states
386-
if (filter != null && string.IsNullOrEmpty(filter.Id) && !filter.States.IsNullOrEmpty())
386+
if (filter != null && !filter.States.IsNullOrEmpty())
387387
{
388388
foreach (var pair in filter.States)
389389
{

src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Log.cs

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,28 +152,72 @@ public PagedItems<InstructionLogModel> GetInstructionLogs(InstructLogFilter filt
152152
filter = InstructLogFilter.Empty();
153153
}
154154

155-
var builder = Builders<InstructionLogDocument>.Filter;
156-
var filters = new List<FilterDefinition<InstructionLogDocument>>() { builder.Empty };
155+
var logBuilder = Builders<InstructionLogDocument>.Filter;
156+
var logFilters = new List<FilterDefinition<InstructionLogDocument>>() { logBuilder.Empty };
157157

158158
// Filter logs
159159
if (!filter.AgentIds.IsNullOrEmpty())
160160
{
161-
filters.Add(builder.In(x => x.AgentId, filter.AgentIds));
161+
logFilters.Add(logBuilder.In(x => x.AgentId, filter.AgentIds));
162162
}
163163
if (!filter.Providers.IsNullOrEmpty())
164164
{
165-
filters.Add(builder.In(x => x.Provider, filter.Providers));
165+
logFilters.Add(logBuilder.In(x => x.Provider, filter.Providers));
166166
}
167167
if (!filter.Models.IsNullOrEmpty())
168168
{
169-
filters.Add(builder.In(x => x.Model, filter.Models));
169+
logFilters.Add(logBuilder.In(x => x.Model, filter.Models));
170170
}
171171
if (!filter.TemplateNames.IsNullOrEmpty())
172172
{
173-
filters.Add(builder.In(x => x.TemplateName, filter.TemplateNames));
173+
logFilters.Add(logBuilder.In(x => x.TemplateName, filter.TemplateNames));
174174
}
175175

176-
var filterDef = builder.And(filters);
176+
// Filter states
177+
if (filter != null && !filter.States.IsNullOrEmpty())
178+
{
179+
foreach (var pair in filter.States)
180+
{
181+
if (string.IsNullOrWhiteSpace(pair.Key)) continue;
182+
183+
// Format key
184+
var keys = pair.Key.Split(".").ToList();
185+
keys.Insert(1, "data");
186+
keys.Insert(0, "States");
187+
var formattedKey = string.Join(".", keys);
188+
189+
if (string.IsNullOrWhiteSpace(pair.Value))
190+
{
191+
logFilters.Add(logBuilder.Exists(formattedKey));
192+
}
193+
else if (bool.TryParse(pair.Value, out var boolValue))
194+
{
195+
logFilters.Add(logBuilder.Eq(formattedKey, boolValue));
196+
}
197+
else if (int.TryParse(pair.Value, out var intValue))
198+
{
199+
logFilters.Add(logBuilder.Eq(formattedKey, intValue));
200+
}
201+
else if (decimal.TryParse(pair.Value, out var decimalValue))
202+
{
203+
logFilters.Add(logBuilder.Eq(formattedKey, decimalValue));
204+
}
205+
else if (float.TryParse(pair.Value, out var floatValue))
206+
{
207+
logFilters.Add(logBuilder.Eq(formattedKey, floatValue));
208+
}
209+
else if (double.TryParse(pair.Value, out var doubleValue))
210+
{
211+
logFilters.Add(logBuilder.Eq(formattedKey, doubleValue));
212+
}
213+
else
214+
{
215+
logFilters.Add(logBuilder.Eq(formattedKey, pair.Value));
216+
}
217+
}
218+
}
219+
220+
var filterDef = logBuilder.And(logFilters);
177221
var sortDef = Builders<InstructionLogDocument>.Sort.Descending(x => x.CreatedTime);
178222
var docs = _dc.InstructionLogs.Find(filterDef).Sort(sortDef).Skip(filter.Offset).Limit(filter.Size).ToList();
179223
var count = _dc.InstructionLogs.CountDocuments(filterDef);

src/WebStarter/appsettings.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,10 @@
222222
"Enabled": false
223223
},
224224

225+
"Instruction": {
226+
"EnableLog": true
227+
},
228+
225229
"ChatHub": {
226230
"EventDispatchBy": "group"
227231
},

0 commit comments

Comments
 (0)