diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/IUserIdentity.cs b/src/Infrastructure/BotSharp.Abstraction/Users/IUserIdentity.cs
index 81b0743b7..2f7a56e96 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Users/IUserIdentity.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Users/IUserIdentity.cs
@@ -4,6 +4,7 @@ public interface IUserIdentity
{
string Id { get; }
string Email { get; }
+ string UserName { get; }
string FirstName { get; }
string LastName { get; }
}
diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs b/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs
index a56e505fe..2e96d7828 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Users/Models/User.cs
@@ -5,6 +5,7 @@ namespace BotSharp.Abstraction.Users.Models;
public class User
{
public string Id { get; set; } = string.Empty;
+ public string UserName { get; set; } = string.Empty;
public string FirstName { get; set; } = string.Empty;
public string LastName { get; set; } = string.Empty;
public string Email { get; set; } = string.Empty;
diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs
index b428c86bd..449d2c3fa 100644
--- a/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs
+++ b/src/Infrastructure/BotSharp.Core/Infrastructures/Utilities.cs
@@ -23,6 +23,9 @@ public static (string, string) SplitAsTuple(this string str, string sep)
return (splits[0], splits[1]);
}
+ ///
+ /// Flush cache
+ ///
public static void ClearCache()
{
// Clear whole cache.
diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserIdentity.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserIdentity.cs
index e0b4051d3..167d5cfec 100644
--- a/src/Infrastructure/BotSharp.Core/Users/Services/UserIdentity.cs
+++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserIdentity.cs
@@ -17,6 +17,9 @@ public UserIdentity(IHttpContextAccessor contextAccessor)
public string Id
=> _claims?.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value!;
+ public string UserName
+ => _claims?.FirstOrDefault(x => x.Type == ClaimTypes.Name)?.Value!;
+
public string Email
=> _claims?.FirstOrDefault(x => x.Type == ClaimTypes.Email)?.Value!;
diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs
index f6cfd5545..9fd1c6761 100644
--- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs
+++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs
@@ -1,5 +1,4 @@
using BotSharp.Abstraction.Repositories;
-using BotSharp.Abstraction.Repositories.Records;
using BotSharp.Abstraction.Users.Models;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
@@ -29,12 +28,15 @@ public async Task CreateUser(User user)
}
record = user;
+ record.UserName = user.UserName.ToLower();
record.Email = user.Email.ToLower();
record.Salt = Guid.NewGuid().ToString("N");
record.Password = Utilities.HashText(user.Password, record.Salt);
- record.ExternalId = _user.Id;
db.CreateUser(record);
+
+ Utilities.ClearCache();
+
return record;
}
diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs
index f72749bf3..21f283967 100644
--- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs
+++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserCreationModel.cs
@@ -1,10 +1,10 @@
using BotSharp.Abstraction.Users.Enums;
-using BotSharp.Abstraction.Users.Models;
namespace BotSharp.OpenAPI.ViewModels.Users;
public class UserCreationModel
{
+ public string UserName { get; set; } = string.Empty;
public string FirstName { get; set; } = string.Empty;
public string LastName { get; set; } = string.Empty;
public string Email { get; set; } = string.Empty;
@@ -15,6 +15,7 @@ public User ToUser()
{
return new User
{
+ UserName = UserName,
FirstName = FirstName,
LastName = LastName,
Email = Email,
diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs
index c2cbfba40..f3083abd6 100644
--- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs
+++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Users/UserViewModel.cs
@@ -1,6 +1,4 @@
-using BotSharp.Abstraction.Agents.Enums;
using BotSharp.Abstraction.Users.Enums;
-using BotSharp.Abstraction.Users.Models;
using System.Text.Json.Serialization;
namespace BotSharp.OpenAPI.ViewModels.Users;
@@ -8,6 +6,8 @@ namespace BotSharp.OpenAPI.ViewModels.Users;
public class UserViewModel
{
public string Id { get; set; }
+ [JsonPropertyName("user_name")]
+ public string UserName { get; set; }
[JsonPropertyName("first_name")]
public string FirstName { get; set; }
[JsonPropertyName("last_name")]
@@ -32,6 +32,7 @@ public static UserViewModel FromUser(User user)
return new UserViewModel
{
Id = user.Id,
+ UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
Email = user.Email,
diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/SignalRHub.cs b/src/Plugins/BotSharp.Plugin.ChatHub/SignalRHub.cs
index 65ba4434c..0593b94f9 100644
--- a/src/Plugins/BotSharp.Plugin.ChatHub/SignalRHub.cs
+++ b/src/Plugins/BotSharp.Plugin.ChatHub/SignalRHub.cs
@@ -24,7 +24,7 @@ public SignalRHub(IServiceProvider services,
public override async Task OnConnectedAsync()
{
- _logger.LogInformation($"SignalR Hub: {_user.FirstName} {_user.LastName} ({Context.UserIdentifier}) connected in {Context.ConnectionId} [{DateTime.Now}]");
+ _logger.LogInformation($"SignalR Hub: {_user.FirstName} {_user.LastName} ({Context.User.Identity.Name}) connected in {Context.ConnectionId}");
var hooks = _services.GetServices();
var convService = _services.GetRequiredService();
@@ -32,6 +32,7 @@ public override async Task OnConnectedAsync()
if (!string.IsNullOrEmpty(conversationId))
{
+ _logger.LogInformation($"Connection {Context.ConnectionId} is with conversation {conversationId}");
var conv = await convService.GetConversation(conversationId);
if (conv != null)
{
diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs
index f7f5320ed..71829d546 100644
--- a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs
+++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/UserDocument.cs
@@ -2,6 +2,7 @@ namespace BotSharp.Plugin.MongoStorage.Collections;
public class UserDocument : MongoBase
{
+ public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs
index 3efc6cb3d..0f7a2750e 100644
--- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs
+++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.cs
@@ -117,6 +117,7 @@ public int Transaction(Action action)
var users = _users.Select(x => new UserDocument
{
Id = !string.IsNullOrEmpty(x.Id) ? x.Id : Guid.NewGuid().ToString(),
+ UserName = x.UserName,
FirstName = x.FirstName,
LastName = x.LastName,
Salt = x.Salt,
@@ -132,6 +133,7 @@ public int Transaction(Action action)
{
var filter = Builders.Filter.Eq(x => x.Id, user.Id);
var update = Builders.Update
+ .Set(x => x.UserName, user.UserName)
.Set(x => x.FirstName, user.FirstName)
.Set(x => x.LastName, user.LastName)
.Set(x => x.Email, user.Email)
@@ -868,6 +870,7 @@ public List GetLastConversations()
return user != null ? new User
{
Id = user.Id,
+ UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
Email = user.Email,
@@ -884,6 +887,7 @@ public List GetLastConversations()
return user != null ? new User
{
Id = user.Id,
+ UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
Email = user.Email,
@@ -901,6 +905,7 @@ public void CreateUser(User user)
var userCollection = new UserDocument
{
Id = Guid.NewGuid().ToString(),
+ UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
Salt = user.Salt,
diff --git a/src/Plugins/BotSharp.Plugin.WeChat/Users/WeChatAccountUserService.cs b/src/Plugins/BotSharp.Plugin.WeChat/Users/WeChatAccountUserService.cs
index bf48c4339..e2b6d910b 100644
--- a/src/Plugins/BotSharp.Plugin.WeChat/Users/WeChatAccountUserService.cs
+++ b/src/Plugins/BotSharp.Plugin.WeChat/Users/WeChatAccountUserService.cs
@@ -2,6 +2,7 @@
using BotSharp.Abstraction.Users.Models;
using BotSharp.Core.Repository;
using Microsoft.EntityFrameworkCore;
+using Senparc.Weixin.MP.AdvancedAPIs.MerChant;
using System;
using System.Collections.Generic;
using System.Text;
@@ -21,6 +22,7 @@ public async Task GetOrCreateWeChatAccountUserAsync(string appId, string o
{
var user = await userService.CreateUser(new User()
{
+ UserName = openId + "@" + appId + ".wechat",
Email = openId + "@" + appId + ".wechat",
Password = openId
});
diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ClickElement.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ClickElement.cs
index 6626161d9..a8965db83 100644
--- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ClickElement.cs
+++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ClickElement.cs
@@ -14,7 +14,7 @@ public async Task ClickElement(Agent agent, BrowsingContextIn context, string me
foreach (var a in anchors)
{
var text = await a.TextContentAsync();
- str.Add($"{text}");
+ str.Add($"{(string.IsNullOrEmpty(text) ? "EMPTY" : text)}");
}
var buttons = await body.QuerySelectorAllAsync("button");
diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/agents/f3ae2a0f-e6ba-4ee1-a0b9-75d7431ff32b/functions.json b/src/Plugins/BotSharp.Plugin.WebDriver/agents/f3ae2a0f-e6ba-4ee1-a0b9-75d7431ff32b/functions.json
index 7b3014a47..1f6aceace 100644
--- a/src/Plugins/BotSharp.Plugin.WebDriver/agents/f3ae2a0f-e6ba-4ee1-a0b9-75d7431ff32b/functions.json
+++ b/src/Plugins/BotSharp.Plugin.WebDriver/agents/f3ae2a0f-e6ba-4ee1-a0b9-75d7431ff32b/functions.json
@@ -10,7 +10,7 @@
"description": "website url."
}
},
- "required": []
+ "required": ["url"]
}
},
{
@@ -42,7 +42,7 @@
"description": "user input."
}
},
- "required": ["element_name"]
+ "required": ["element_name", "input_text"]
}
}
]
diff --git a/src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/user.json b/src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/user.json
index 58873daf2..d2eb033f5 100644
--- a/src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/user.json
+++ b/src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/user.json
@@ -1,4 +1,5 @@
{
+ "userName": "guest",
"firstName": "Guest",
"lastName": "Anonymous",
"email": "guest@gmail.com",
diff --git a/src/WebStarter/data/users/456e35c5-caf0-4d45-9084-b44a8ca717e4/user.json b/src/WebStarter/data/users/456e35c5-caf0-4d45-9084-b44a8ca717e4/user.json
index e369d82ab..f8273fbbf 100644
--- a/src/WebStarter/data/users/456e35c5-caf0-4d45-9084-b44a8ca717e4/user.json
+++ b/src/WebStarter/data/users/456e35c5-caf0-4d45-9084-b44a8ca717e4/user.json
@@ -1,4 +1,5 @@
-{
+{
+ "userName": "haiping",
"firstName": "Haiping",
"lastName": "Chen",
"email": "admin@gmail.com",
diff --git a/src/WebStarter/data/users/d0e6680d-03d5-4ed8-bdcd-aa7d86f2a1bc/user.json b/src/WebStarter/data/users/d0e6680d-03d5-4ed8-bdcd-aa7d86f2a1bc/user.json
index b9db2bc46..ab408d778 100644
--- a/src/WebStarter/data/users/d0e6680d-03d5-4ed8-bdcd-aa7d86f2a1bc/user.json
+++ b/src/WebStarter/data/users/d0e6680d-03d5-4ed8-bdcd-aa7d86f2a1bc/user.json
@@ -1,4 +1,5 @@
{
+ "userName": "nancy",
"firstName": "Nancy",
"lastName": "Luna",
"email": "user1@gmail.com",
diff --git a/src/WebStarter/data/users/e465af5f-044f-414b-b670-92834929b96c/user.json b/src/WebStarter/data/users/e465af5f-044f-414b-b670-92834929b96c/user.json
index b5b799225..97df16c0a 100644
--- a/src/WebStarter/data/users/e465af5f-044f-414b-b670-92834929b96c/user.json
+++ b/src/WebStarter/data/users/e465af5f-044f-414b-b670-92834929b96c/user.json
@@ -1,4 +1,5 @@
{
+ "userName": "elon",
"firstName": "Elon",
"lastName": "Musk",
"email": "csr1@gmail.com",