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",