diff --git a/BotSharp.Core/AgentStorage/AgentStorageFactory.cs b/BotSharp.Core/AgentStorage/AgentStorageFactory.cs new file mode 100644 index 00000000..aaaf3976 --- /dev/null +++ b/BotSharp.Core/AgentStorage/AgentStorageFactory.cs @@ -0,0 +1,30 @@ +using BotSharp.Core; +using BotSharp.Platform.Abstraction; +using BotSharp.Platform.Models; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace BotSharp.Core.AgentStorage +{ + public class AgentStorageFactory : IAgentStorageFactory where TAgent : AgentBase + { + private readonly Func> func; + private readonly IPlatformSettings platformSetting; + + public AgentStorageFactory(IPlatformSettings setting, Func> serviceAccessor) + { + this.func = serviceAccessor; + this.platformSetting = setting; + } + + public async Task> Get() + { + IAgentStorage storage = null; + string storageName = this.platformSetting.AgentStorage; + storage = func(storageName); + return storage as IAgentStorage; + } + } +} diff --git a/BotSharp.Core/AgentStorageInMemory.cs b/BotSharp.Core/AgentStorage/AgentStorageInMemory.cs similarity index 97% rename from BotSharp.Core/AgentStorageInMemory.cs rename to BotSharp.Core/AgentStorage/AgentStorageInMemory.cs index 854e3782..a3671b45 100644 --- a/BotSharp.Core/AgentStorageInMemory.cs +++ b/BotSharp.Core/AgentStorage/AgentStorageInMemory.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BotSharp.Core +namespace BotSharp.Core.AgentStorage { /// /// Save agent instance into memory. diff --git a/BotSharp.Core/AgentStorageInRedis.cs b/BotSharp.Core/AgentStorage/AgentStorageInRedis.cs similarity index 98% rename from BotSharp.Core/AgentStorageInRedis.cs rename to BotSharp.Core/AgentStorage/AgentStorageInRedis.cs index e76b64c2..dc7ee711 100644 --- a/BotSharp.Core/AgentStorageInRedis.cs +++ b/BotSharp.Core/AgentStorage/AgentStorageInRedis.cs @@ -9,7 +9,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BotSharp.Core +namespace BotSharp.Core.AgentStorage { public class AgentStorageInRedis : IAgentStorage where TAgent : AgentBase diff --git a/BotSharp.Core/AgentStorage/AgentStorageServiceRegister.cs b/BotSharp.Core/AgentStorage/AgentStorageServiceRegister.cs new file mode 100644 index 00000000..535bb2d1 --- /dev/null +++ b/BotSharp.Core/AgentStorage/AgentStorageServiceRegister.cs @@ -0,0 +1,43 @@ +using BotSharp.Platform.Abstraction; +using BotSharp.Platform.Models; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using System; +using System.Collections.Generic; +using System.Text; + +namespace BotSharp.Core.AgentStorage +{ + public class AgentStorageServiceRegister + { + public static void Register(IServiceCollection services) + where TAgent : AgentBase + { + services.AddSingleton, AgentStorageFactory>(); + + services.AddSingleton>(); + services.AddSingleton>(); + + services.AddSingleton(factory => + { + Func> accesor = key => + { + if (key.Equals("AgentStorageInRedis")) + { + return factory.GetService>(); + } + else if (key.Equals("AgentStorageInMemory")) + { + return factory.GetService>(); + } + else + { + throw new ArgumentException($"Not Support key : {key}"); + } + }; + + return accesor; + }); + } + } +} diff --git a/BotSharp.Core/BotSharp.Core.csproj b/BotSharp.Core/BotSharp.Core.csproj index bfed6e4f..63225fc6 100644 --- a/BotSharp.Core/BotSharp.Core.csproj +++ b/BotSharp.Core/BotSharp.Core.csproj @@ -21,13 +21,13 @@ If you feel that this project is helpful to you, please Star on the project, we MIT https://github.com/Oceania2018/BotSharp NLU, Chatbot, Bot, AI Bot, Artificial Intelligence, RPA - 1.5.0 + 1.6.0 Monthly Update. Integrated with Articulate UI. If you feel that this project is helpful to you, please Star on the project, we will be very grateful. Since 2018 Haiping Chen https://github.com/Oceania2018/BotSharp - 1.5.0.0 + 1.6.0.0 https://raw.githubusercontent.com/Oceania2018/BotSharp/master/BotSharp.WebHost/wwwroot/images/BotSharp.png https://github.com/Oceania2018/BotSharp/blob/master/LICENSE @@ -81,7 +81,6 @@ If you feel that this project is helpful to you, please Star on the project, we - diff --git a/BotSharp.Core/Engines/BotTrainer.cs b/BotSharp.Core/Engines/BotTrainer.cs index e93d8b4d..35c00a95 100644 --- a/BotSharp.Core/Engines/BotTrainer.cs +++ b/BotSharp.Core/Engines/BotTrainer.cs @@ -5,11 +5,11 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using BotSharp.Core.Abstractions; +using BotSharp.Platform.Abstraction; using BotSharp.Platform.Models; using BotSharp.Platform.Models.MachineLearning; using DotNetToolkit; using EntityFrameworkCore.BootKit; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -22,9 +22,11 @@ namespace BotSharp.Core.Engines private readonly Database dc; private readonly string agentId; + private readonly IPlatformSettings settings; - public BotTrainer() + public BotTrainer(IPlatformSettings setting) { + this.settings = setting; } public BotTrainer(string agentId, Database dc) @@ -40,8 +42,8 @@ namespace BotSharp.Core.Engines // Get NLP Provider var config = (IConfiguration)AppDomain.CurrentDomain.GetData("Configuration"); var assemblies = (string[])AppDomain.CurrentDomain.GetData("Assemblies"); - var platform = config.GetSection($"platform").Value; - var engine = config.GetSection($"{platform}:botEngine").Value; + var platform = config.GetSection($"platformModuleName").Value; + var engine = this.settings.BotEngine; string providerName = config.GetSection($"{engine}:Provider").Value; var provider = TypeHelper.GetInstance(providerName, assemblies) as INlpProvider; provider.Configuration = config.GetSection(engine); diff --git a/BotSharp.Core/IAgentStorageFactory.cs b/BotSharp.Core/IAgentStorageFactory.cs deleted file mode 100644 index 2f8b520b..00000000 --- a/BotSharp.Core/IAgentStorageFactory.cs +++ /dev/null @@ -1,11 +0,0 @@ -using BotSharp.Platform.Abstraction; -using BotSharp.Platform.Models; -using System.Threading.Tasks; - -namespace BotSharp.Core -{ - public interface IAgentStorageFactory - { - Task> Get() where TAgent : AgentBase; - } -} diff --git a/BotSharp.Core/Modules/IModule.cs b/BotSharp.Core/Modules/IModule.cs index 550b129b..2f8ed9f9 100644 --- a/BotSharp.Core/Modules/IModule.cs +++ b/BotSharp.Core/Modules/IModule.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; @@ -27,6 +28,6 @@ namespace BotSharp.Core.Modules /// /// Instance of . /// - void Configure(IApplicationBuilder app); + void Configure(IApplicationBuilder app, IHostingEnvironment env); } } diff --git a/BotSharp.Core/Modules/ModulesStartup.cs b/BotSharp.Core/Modules/ModulesStartup.cs index 133f8538..3dbae39c 100644 --- a/BotSharp.Core/Modules/ModulesStartup.cs +++ b/BotSharp.Core/Modules/ModulesStartup.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; @@ -77,11 +78,11 @@ namespace BotSharp.Core.Modules /// /// Instance of . /// - public void Configure(IApplicationBuilder app) + public void Configure(IApplicationBuilder app, IHostingEnvironment env) { foreach (IModule module in this._modules) { - module.Configure(app); + module.Configure(app, env); } } } diff --git a/BotSharp.Core/Modules/PlatformModuleAssembyLoader.cs b/BotSharp.Core/Modules/PlatformModuleAssembyLoader.cs index 62b11c0d..3ab13098 100644 --- a/BotSharp.Core/Modules/PlatformModuleAssembyLoader.cs +++ b/BotSharp.Core/Modules/PlatformModuleAssembyLoader.cs @@ -18,31 +18,32 @@ namespace Microsoft.Extensions.DependencyInjection { ModulesOptions options = configuration.Get(); - var platform = configuration.GetValue("platformModuleName"); - var module = options.Modules.Find(x => x.Name == platform); - var engine = configuration.GetValue($"{platform}:BotEngine"); - - Formatter[] settings = new Formatter[] - { - new Formatter(platform, Color.Yellow), - new Formatter(module.Name, Color.Yellow), - new Formatter(engine, Color.Yellow), - }; - // load platform emulator dynamically Console.WriteLine(); - var platformDllPath = Path.Combine(options.ModuleBasePath, module.Path, $"{module.Type}.dll"); - if (File.Exists(platformDllPath)) - { - Assembly library = AssemblyLoadContext.Default.LoadFromAssemblyPath(platformDllPath); - action(library); - Console.WriteLineFormatted("Loaded {0} platform emulator from {1} assembly which is using {2} engine.", Color.White, settings); - } - else - { - Console.WriteLine($"Can't load {module.Type} assembly."); - } + options.Modules.ForEach(module => { + + var dllPath = Path.Combine(options.ModuleBasePath, module.Path, $"{module.Type}.dll"); + if (File.Exists(dllPath)) + { + Assembly library = AssemblyLoadContext.Default.LoadFromAssemblyPath(dllPath); + action(library); + + Formatter[] settings = new Formatter[] + { + new Formatter(module.Name, Color.Yellow), + new Formatter(module.Type, Color.Yellow), + new Formatter(dllPath, Color.Yellow) + }; + Console.WriteLineFormatted("Loaded {0} module, type: {1}, path: {2}", Color.White, settings); + } + else + { + Console.WriteLine($"Can't load {module.Type} assembly from {dllPath}."); + } + + }); + Console.WriteLine(); } } diff --git a/BotSharp.Core/NLUSetting.cs b/BotSharp.Core/NLUSetting.cs deleted file mode 100644 index 594989e6..00000000 --- a/BotSharp.Core/NLUSetting.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Options; -using System; -using System.Collections.Generic; -using System.Text; - -namespace BotSharp.Core -{ - public class NLUSetting - { - - public string BotEngine { get; set; } - - public string AgentStorage { get; set; } - } - -} diff --git a/BotSharp.Core/PlatformBuilderBase.cs b/BotSharp.Core/PlatformBuilderBase.cs index 12f1e60d..1d991f6a 100644 --- a/BotSharp.Core/PlatformBuilderBase.cs +++ b/BotSharp.Core/PlatformBuilderBase.cs @@ -18,11 +18,13 @@ namespace BotSharp.Core { public IAgentStorage Storage { get; set; } - private readonly IAgentStorageFactory agentStorageFactory; + private readonly IAgentStorageFactory agentStorageFactory; + private readonly IPlatformSettings settings; - public PlatformBuilderBase(IAgentStorageFactory agentStorageFactory) + public PlatformBuilderBase(IAgentStorageFactory agentStorageFactory, IPlatformSettings settings) { this.agentStorageFactory = agentStorageFactory; + this.settings = settings; } public async Task> GetAllAgents() @@ -89,7 +91,7 @@ namespace BotSharp.Core options.Model = "model_" + DateTime.UtcNow.ToString("yyyyMMdd"); } - var trainer = new BotTrainer(); + var trainer = new BotTrainer(settings); agent.Corpus = corpus; var info = await trainer.Train(agent, options); @@ -111,7 +113,7 @@ namespace BotSharp.Core { if (Storage == null) { - Storage = await agentStorageFactory.Get(); + Storage = await agentStorageFactory.Get(); } return Storage; } diff --git a/BotSharp.Core/PlatformConfigServiceRegister.cs b/BotSharp.Core/PlatformConfigServiceRegister.cs new file mode 100644 index 00000000..6535eb11 --- /dev/null +++ b/BotSharp.Core/PlatformConfigServiceRegister.cs @@ -0,0 +1,32 @@ +using BotSharp.Platform.Abstraction; +using Colorful; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using Console = Colorful.Console; + +namespace BotSharp.Core +{ + public class PlatformConfigServiceRegister + { + public static void Register(string section, IServiceCollection services, IConfiguration config) + where ISettings : IPlatformSettings, new() + { + var setting = new ISettings(); + config.GetSection(section).Bind(setting); + services.AddSingleton(setting); + + Formatter[] settings = new Formatter[] + { + new Formatter(setting.BotEngine, Color.Yellow), + new Formatter(setting.AgentStorage, Color.Yellow) + }; + + Console.WriteLineFormatted("NLU engine: {0}, Agent Storage: {1}.", Color.White, settings); + Console.WriteLine(); + } + } +} diff --git a/BotSharp.Core/PlatformSettingsBase.cs b/BotSharp.Core/PlatformSettingsBase.cs new file mode 100644 index 00000000..a2d00268 --- /dev/null +++ b/BotSharp.Core/PlatformSettingsBase.cs @@ -0,0 +1,26 @@ +using BotSharp.Platform.Abstraction; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Text; + +namespace BotSharp.Core +{ + public class PlatformSettingsBase : IPlatformSettings + { + /// + /// Set default settings + /// + public PlatformSettingsBase() + { + BotEngine = "BotSharpNLU"; + AgentStorage = "AgentStorageInMemory"; + } + + public string BotEngine { get; set; } + + public string AgentStorage { get; set; } + } + +} diff --git a/BotSharp.NLP/BotSharp.NLP.csproj b/BotSharp.NLP/BotSharp.NLP.csproj index a2e8be07..26678b03 100644 --- a/BotSharp.NLP/BotSharp.NLP.csproj +++ b/BotSharp.NLP/BotSharp.NLP.csproj @@ -4,7 +4,7 @@ netstandard2.0 AnyCPU;x64 true - 0.3.0 + 0.4.0 Botsharp.NLP is a set of tools for building C# programs to work with human language data. It can be used in common tasks like POS, NER and text classification in the NLP or NLU field. BotSharp.NLP has implemented below machine learning algorithms: diff --git a/BotSharp.Platform.Abstraction/BotSharp.Platform.Abstraction.csproj b/BotSharp.Platform.Abstraction/BotSharp.Platform.Abstraction.csproj index 0dddb6cc..58913343 100644 --- a/BotSharp.Platform.Abstraction/BotSharp.Platform.Abstraction.csproj +++ b/BotSharp.Platform.Abstraction/BotSharp.Platform.Abstraction.csproj @@ -2,6 +2,8 @@ netstandard2.0 + true + 0.1.0 diff --git a/BotSharp.Platform.Abstraction/IAgentStorageFactory.cs b/BotSharp.Platform.Abstraction/IAgentStorageFactory.cs new file mode 100644 index 00000000..9f5a2bfb --- /dev/null +++ b/BotSharp.Platform.Abstraction/IAgentStorageFactory.cs @@ -0,0 +1,11 @@ +using BotSharp.Platform.Abstraction; +using BotSharp.Platform.Models; +using System.Threading.Tasks; + +namespace BotSharp.Platform.Abstraction +{ + public interface IAgentStorageFactory where TAgent : AgentBase + { + Task> Get(); + } +} diff --git a/BotSharp.Platform.Abstraction/IPlatformSettings.cs b/BotSharp.Platform.Abstraction/IPlatformSettings.cs new file mode 100644 index 00000000..dafe4fbb --- /dev/null +++ b/BotSharp.Platform.Abstraction/IPlatformSettings.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BotSharp.Platform.Abstraction +{ + public interface IPlatformSettings + { + string BotEngine { get; set; } + + string AgentStorage { get; set; } + } +} diff --git a/BotSharp.Platform.Models/BotSharp.Platform.Models.csproj b/BotSharp.Platform.Models/BotSharp.Platform.Models.csproj index 5ca7d4a8..715df064 100644 --- a/BotSharp.Platform.Models/BotSharp.Platform.Models.csproj +++ b/BotSharp.Platform.Models/BotSharp.Platform.Models.csproj @@ -2,6 +2,8 @@ netstandard2.0 + true + 0.1.0 diff --git a/BotSharp.RestApi/Integrations/FacebookMessenger/FacebookMessengerController.cs b/BotSharp.RestApi/Integrations/FacebookMessenger/FacebookMessengerController.cs deleted file mode 100644 index 8545f3a5..00000000 --- a/BotSharp.RestApi/Integrations/FacebookMessenger/FacebookMessengerController.cs +++ /dev/null @@ -1,117 +0,0 @@ -using BotSharp.Core.Engines; -using BotSharp.NLP; -using BotSharp.Platform.Models; -using BotSharp.RestApi.Integrations.FacebookMessenger; -using DotNetToolkit; -using EntityFrameworkCore.BootKit; -using Microsoft.AspNetCore.Mvc; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; -using RestSharp; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BotSharp.RestApi.Integrations -{ - [Route("v1/[controller]")] - public class FacebookMessengerController : ControllerBase - { - [HttpGet("{agentId}")] - public ActionResult Verify([FromRoute] string agentId) - { - var mode = Request.Query.ContainsKey("hub.mode") ? Request.Query["hub.mode"].ToString() : String.Empty; - var token = Request.Query.ContainsKey("hub.verify_token") ? Request.Query["hub.verify_token"].ToString() : String.Empty; - var challenge = Request.Query.ContainsKey("hub.challenge") ? Request.Query["hub.challenge"].ToString() : String.Empty; - - if (mode == "subscribe") - { - var dc = new DefaultDataContextLoader().GetDefaultDc(); - var config = dc.Table().FirstOrDefault(x => x.AgentId == agentId && x.Platform == "Facebook Messenger"); - - return config.VerifyToken == token ? Ok(challenge) : Ok(agentId); - } - - return BadRequest(); - } - - [HttpPost("{agentId}")] - public async Task CallbackAsync([FromRoute] string agentId) - { - WebhookEvent body; - IWebhookMessageBody response = null; - - using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8)) - { - var json = await reader.ReadToEndAsync(); - body = JsonConvert.DeserializeObject(json); - } - - body.Entry.ForEach(entry => - { - entry.Messaging.ForEach(msg => - { - // received text message - if (msg.Message.ContainsKey("text")) - { - OnTextMessaged(agentId, new WebhookMessage - { - Sender = msg.Sender, - Recipient = msg.Recipient, - Timestamp = msg.Timestamp, - Message = msg.Message.ToObject() - }); - } - }); - - }); - - return Ok(); - } - - private void OnTextMessaged(string agentId, WebhookMessage message) - { - Console.WriteLine($"OnTextMessaged: {message.Message.Text}"); - - /*var ai = new ApiAi(); - var agent = ai.LoadAgent(agentId); - ai.AiConfig = new AIConfiguration(agent.ClientAccessToken, SupportedLanguage.English) { AgentId = agentId }; - ai.AiConfig.SessionId = message.Sender.Id; - var aiResponse = ai.TextRequest(new AIRequest { Query = new String[] { message.Message.Text } }); - - var dc = new DefaultDataContextLoader().GetDefaultDc(); - var config = dc.Table().FirstOrDefault(x => x.AgentId == agentId && x.Platform == "Facebook Messenger"); - - SendTextMessage(config.AccessToken, new WebhookMessage - { - Recipient = message.Sender.ToObject(), - Message = new WebhookTextMessage - { - Text = String.IsNullOrEmpty(aiResponse.Result.Fulfillment.Speech) ? aiResponse.Result.Action : aiResponse.Result.Fulfillment.Speech - } - });*/ - } - - private void SendTextMessage(string accessToken, WebhookMessage body) - { - var client = new RestClient("https://graph.facebook.com"); - - var rest = new RestRequest("v2.6/me/messages", Method.POST); - string json = JsonConvert.SerializeObject(body, - new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore - }); - - rest.AddParameter("application/json", json, ParameterType.RequestBody); - rest.AddQueryParameter("access_token", accessToken); - - var response = client.Execute(rest); - } - } -} diff --git a/BotSharp.RestApi/Integrations/FacebookMessenger/IWebhookMessageBody.cs b/BotSharp.RestApi/Integrations/FacebookMessenger/IWebhookMessageBody.cs deleted file mode 100644 index 20e97b01..00000000 --- a/BotSharp.RestApi/Integrations/FacebookMessenger/IWebhookMessageBody.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace BotSharp.RestApi.Integrations.FacebookMessenger -{ - public interface IWebhookMessageBody - { - } -} diff --git a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookEvent.cs b/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookEvent.cs deleted file mode 100644 index 86dd445a..00000000 --- a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookEvent.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace BotSharp.RestApi.Integrations.FacebookMessenger -{ - public class WebhookEvent - { - public string Object { get; set; } - public List Entry { get; set; } - } - - -} diff --git a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookEventEntry.cs b/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookEventEntry.cs deleted file mode 100644 index ab1cadd1..00000000 --- a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookEventEntry.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace BotSharp.RestApi.Integrations.FacebookMessenger -{ - public class WebhookEventEntry - { - public string Id { get; set; } - public long Time { get; set; } - public List Messaging { get; set; } - } -} diff --git a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessage.cs b/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessage.cs deleted file mode 100644 index 7dfd387b..00000000 --- a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessage.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.Text; - -namespace BotSharp.RestApi.Integrations.FacebookMessenger -{ - public class WebhookMessage - { - public WebhookMessageSender Sender { get; set; } - - public WebhookMessageRecipient Recipient { get; set; } - - public long Timestamp { get; set; } - - public JObject Message { get; set; } - } - - public class WebhookMessage where TWebhookMessage : IWebhookMessageBody - { - public WebhookMessageSender Sender { get; set; } - - public WebhookMessageRecipient Recipient { get; set; } - - public long Timestamp { get; set; } - - public TWebhookMessage Message { get; set; } - } -} diff --git a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessageQuickReply.cs b/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessageQuickReply.cs deleted file mode 100644 index 9abccb34..00000000 --- a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessageQuickReply.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace BotSharp.RestApi.Integrations.FacebookMessenger -{ - public class WebhookMessageQuickReply - { - public String Payload { get; set; } - } -} diff --git a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessageRecipient.cs b/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessageRecipient.cs deleted file mode 100644 index ecea618e..00000000 --- a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessageRecipient.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace BotSharp.RestApi.Integrations.FacebookMessenger -{ - public class WebhookMessageRecipient - { - /// - /// PAGE_ID - /// - public String Id { get; set; } - } -} diff --git a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessageSender.cs b/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessageSender.cs deleted file mode 100644 index ea1b37ad..00000000 --- a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookMessageSender.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace BotSharp.RestApi.Integrations.FacebookMessenger -{ - public class WebhookMessageSender - { - /// - /// PSID - /// - public String Id { get; set; } - } -} diff --git a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookTextMessage.cs b/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookTextMessage.cs deleted file mode 100644 index b7e8b1d3..00000000 --- a/BotSharp.RestApi/Integrations/FacebookMessenger/WebhookTextMessage.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Text; - -namespace BotSharp.RestApi.Integrations.FacebookMessenger -{ - public class WebhookTextMessage : IWebhookMessageBody - { - public string Mid { get; set; } - public String Text { get; set; } - [JsonProperty("quick_reply")] - public WebhookMessageQuickReply QuickReply { get; set; } - } -} diff --git a/BotSharp.WebHost/BotSharp.WebHost.csproj b/BotSharp.WebHost/BotSharp.WebHost.csproj index 2fb92b46..a498794c 100644 --- a/BotSharp.WebHost/BotSharp.WebHost.csproj +++ b/BotSharp.WebHost/BotSharp.WebHost.csproj @@ -4,7 +4,8 @@ netcoreapp2.1 Portable;win10-x64;centos.7-x64 AnyCPU;x64 - Debug;Release;DIALOGFLOW;RASA;ARTICULATE + Debug;Release; + 4ee89154-9131-4e6b-8fd5-d4f04a8d77c4 @@ -18,7 +19,7 @@ false - DEBUG;TRACE;DIALOGFLOW;NETCOREAPP;NETCOREAPP2_1 + DEBUG;TRACE;NETCOREAPP;NETCOREAPP2_1 @@ -79,6 +80,7 @@ + @@ -86,15 +88,9 @@ PreserveNewest - - PreserveNewest - PreserveNewest - - PreserveNewest - PreserveNewest diff --git a/BotSharp.WebHost/Settings/ArticulateAi.json b/BotSharp.WebHost/Settings/ArticulateAi.json deleted file mode 100644 index 81cff34e..00000000 --- a/BotSharp.WebHost/Settings/ArticulateAi.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "articulateAi": { - "botEngine": "BotSharpNLU", - - "agentStorage": "AgentStorageInRedis" - } -} diff --git a/BotSharp.WebHost/Settings/DialogflowAi.json b/BotSharp.WebHost/Settings/DialogflowAi.json index 5b5c6c4b..aa8cba6d 100644 --- a/BotSharp.WebHost/Settings/DialogflowAi.json +++ b/BotSharp.WebHost/Settings/DialogflowAi.json @@ -1,7 +1,7 @@ { + // if you want to override platform setting, please set corresponding value, otherwise you don't need this section. "dialogflowAi": { "botEngine": "BotSharpNLU", - - "agentStorage": "AgentStorageInMemory" + "agentStorage": "AgentStorageInRedis" } } diff --git a/BotSharp.WebHost/Settings/RasaAi.json b/BotSharp.WebHost/Settings/RasaAi.json deleted file mode 100644 index 8c246b86..00000000 --- a/BotSharp.WebHost/Settings/RasaAi.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "rasaAi": { - "botEngine": "BotSharpNLU", - - "agentStorage": "AgentStorageInMemory" - } -} diff --git a/BotSharp.WebHost/Settings/app.json b/BotSharp.WebHost/Settings/app.json index 1cb66df0..562b65d4 100644 --- a/BotSharp.WebHost/Settings/app.json +++ b/BotSharp.WebHost/Settings/app.json @@ -8,13 +8,18 @@ "dataDir": "D:\\Projects\\BotSharp\\Data" }, - "moduleBasePath": "D:\\Projects", + "moduleBasePath": "C:\\Users\\haipi\\Documents\\Projects", "modules": [ { "Name": "DialogflowAi", "Type": "BotSharp.Platform.Dialogflow", "Path": "botsharp-dialogflow\\BotSharp.Platform.Dialogflow\\bin\\Debug\\netstandard2.0" }, + { + "Name": "WeixinChannel", + "Type": "BotSharp.Channel.Weixin", + "Path": "botsharp-channel-weixin\\BotSharp.Channel.Weixin\\bin\\Debug\\netstandard2.0" + } /*, { "Name": "RasaAi", "Type": "BotSharp.Platform.Rasa", @@ -24,6 +29,6 @@ "Name": "ArticulateAi", "Type": "BotSharp.Platform.Articulate", "Path": "botsharp-articulate\\BotSharp.Platform.Articulate\\bin\\Debug\\netstandard2.0" - } + }*/ ] } diff --git a/BotSharp.WebHost/Startup.cs b/BotSharp.WebHost/Startup.cs index f4dea5fc..9ef2eecf 100644 --- a/BotSharp.WebHost/Startup.cs +++ b/BotSharp.WebHost/Startup.cs @@ -98,9 +98,11 @@ namespace BotSharp.WebHost c.DocumentTitle = info.Title; c.InjectStylesheet(Configuration.GetValue("Swagger:Stylesheet")); + Console.WriteLine(); Console.WriteLine($"{info.Title} [{info.Version}] {info.License.Name}"); Console.WriteLine($"{info.Description}"); - Console.WriteLine($"{info.Contact.Name}"); + Console.WriteLine($"{info.Contact.Name}, {DateTime.UtcNow.ToString()}"); + Console.WriteLine(); }); app.Use(async (context, next) => @@ -120,6 +122,8 @@ namespace BotSharp.WebHost app.UseMvc(); + this.modulesStartup.Configure(app, env); + AppDomain.CurrentDomain.SetData("DataPath", Path.Combine(env.ContentRootPath, "App_Data")); AppDomain.CurrentDomain.SetData("Configuration", Configuration); AppDomain.CurrentDomain.SetData("ContentRootPath", env.ContentRootPath); diff --git a/BotSharp.WebHost/wwwroot/images/BotSharp.min.png b/BotSharp.WebHost/wwwroot/images/BotSharp.min.png index 8572d1f8..ea4a355d 100644 Binary files a/BotSharp.WebHost/wwwroot/images/BotSharp.min.png and b/BotSharp.WebHost/wwwroot/images/BotSharp.min.png differ diff --git a/BotSharp.WebHost/wwwroot/images/BotSharp.png b/BotSharp.WebHost/wwwroot/images/BotSharp.png index defe10f9..1ff4ab5d 100644 Binary files a/BotSharp.WebHost/wwwroot/images/BotSharp.png and b/BotSharp.WebHost/wwwroot/images/BotSharp.png differ diff --git a/BotSharp.WebHost/wwwroot/images/BotSharp.psd b/BotSharp.WebHost/wwwroot/images/BotSharp.psd index db98df7b..431b5974 100644 Binary files a/BotSharp.WebHost/wwwroot/images/BotSharp.psd and b/BotSharp.WebHost/wwwroot/images/BotSharp.psd differ diff --git a/BotSharp.sln b/BotSharp.sln index 27dc9a6b..81ba14f1 100644 --- a/BotSharp.sln +++ b/BotSharp.sln @@ -22,11 +22,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Abstracti EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Models", "BotSharp.Platform.Models\BotSharp.Platform.Models.csproj", "{C4F2EAE5-F2C7-4F52-9DB2-7E76D7080C72}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Dialogflow", "..\botsharp-dialogflow\BotSharp.Platform.Dialogflow\BotSharp.Platform.Dialogflow.csproj", "{3599EC12-BE49-4BA2-B02F-86602BC1240C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Dialogflow", "..\botsharp-dialogflow\BotSharp.Platform.Dialogflow\BotSharp.Platform.Dialogflow.csproj", "{4F74387F-7101-428C-B918-38BC5ACCB0A6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Rasa", "..\botsharp-rasa\BotSharp.Platform.Rasa\BotSharp.Platform.Rasa.csproj", "{3DE700F6-16AE-4A14-9119-E72BFBE85AB0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Articulate", "..\botsharp-articulate\BotSharp.Platform.Articulate\BotSharp.Platform.Articulate.csproj", "{ED94ADD1-B8BA-4103-ABF9-662B19E450DD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Channel.Weixin", "..\botsharp-channel-weixin\BotSharp.Channel.Weixin\BotSharp.Channel.Weixin.csproj", "{0F34140A-3714-4586-8A8C-3ABA56221D06}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -54,10 +52,10 @@ Global {03DCA427-327A-4FC9-9A2F-57D17F16708C}.Debug|Any CPU.Build.0 = Debug|Any CPU {03DCA427-327A-4FC9-9A2F-57D17F16708C}.Debug|x64.ActiveCfg = Debug|x64 {03DCA427-327A-4FC9-9A2F-57D17F16708C}.Debug|x64.Build.0 = Debug|x64 - {03DCA427-327A-4FC9-9A2F-57D17F16708C}.DIALOGFLOW|Any CPU.ActiveCfg = DIALOGFLOW|Any CPU - {03DCA427-327A-4FC9-9A2F-57D17F16708C}.DIALOGFLOW|Any CPU.Build.0 = DIALOGFLOW|Any CPU - {03DCA427-327A-4FC9-9A2F-57D17F16708C}.DIALOGFLOW|x64.ActiveCfg = DIALOGFLOW|x64 - {03DCA427-327A-4FC9-9A2F-57D17F16708C}.DIALOGFLOW|x64.Build.0 = DIALOGFLOW|x64 + {03DCA427-327A-4FC9-9A2F-57D17F16708C}.DIALOGFLOW|Any CPU.ActiveCfg = Debug|Any CPU + {03DCA427-327A-4FC9-9A2F-57D17F16708C}.DIALOGFLOW|Any CPU.Build.0 = Debug|Any CPU + {03DCA427-327A-4FC9-9A2F-57D17F16708C}.DIALOGFLOW|x64.ActiveCfg = Debug|x64 + {03DCA427-327A-4FC9-9A2F-57D17F16708C}.DIALOGFLOW|x64.Build.0 = Debug|x64 {03DCA427-327A-4FC9-9A2F-57D17F16708C}.Release|Any CPU.ActiveCfg = Release|Any CPU {03DCA427-327A-4FC9-9A2F-57D17F16708C}.Release|Any CPU.Build.0 = Release|Any CPU {03DCA427-327A-4FC9-9A2F-57D17F16708C}.Release|x64.ActiveCfg = Release|x64 @@ -122,42 +120,30 @@ Global {C4F2EAE5-F2C7-4F52-9DB2-7E76D7080C72}.Release|Any CPU.Build.0 = Release|Any CPU {C4F2EAE5-F2C7-4F52-9DB2-7E76D7080C72}.Release|x64.ActiveCfg = Release|Any CPU {C4F2EAE5-F2C7-4F52-9DB2-7E76D7080C72}.Release|x64.Build.0 = Release|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.Debug|x64.ActiveCfg = Debug|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.Debug|x64.Build.0 = Debug|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.DIALOGFLOW|Any CPU.ActiveCfg = DIALOGFLOW|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.DIALOGFLOW|Any CPU.Build.0 = DIALOGFLOW|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.DIALOGFLOW|x64.ActiveCfg = DIALOGFLOW|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.DIALOGFLOW|x64.Build.0 = DIALOGFLOW|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.Release|Any CPU.Build.0 = Release|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.Release|x64.ActiveCfg = Release|Any CPU - {3599EC12-BE49-4BA2-B02F-86602BC1240C}.Release|x64.Build.0 = Release|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.Debug|x64.ActiveCfg = Debug|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.Debug|x64.Build.0 = Debug|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.DIALOGFLOW|Any CPU.ActiveCfg = Debug|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.DIALOGFLOW|Any CPU.Build.0 = Debug|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.DIALOGFLOW|x64.ActiveCfg = Debug|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.DIALOGFLOW|x64.Build.0 = Debug|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.Release|Any CPU.Build.0 = Release|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.Release|x64.ActiveCfg = Release|Any CPU - {3DE700F6-16AE-4A14-9119-E72BFBE85AB0}.Release|x64.Build.0 = Release|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.Debug|x64.ActiveCfg = Debug|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.Debug|x64.Build.0 = Debug|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.DIALOGFLOW|Any CPU.ActiveCfg = Debug|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.DIALOGFLOW|Any CPU.Build.0 = Debug|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.DIALOGFLOW|x64.ActiveCfg = Debug|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.DIALOGFLOW|x64.Build.0 = Debug|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.Release|Any CPU.Build.0 = Release|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.Release|x64.ActiveCfg = Release|Any CPU - {ED94ADD1-B8BA-4103-ABF9-662B19E450DD}.Release|x64.Build.0 = Release|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.Debug|x64.ActiveCfg = Debug|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.Debug|x64.Build.0 = Debug|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.DIALOGFLOW|Any CPU.ActiveCfg = DIALOGFLOW|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.DIALOGFLOW|Any CPU.Build.0 = DIALOGFLOW|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.DIALOGFLOW|x64.ActiveCfg = DIALOGFLOW|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.DIALOGFLOW|x64.Build.0 = DIALOGFLOW|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.Release|Any CPU.Build.0 = Release|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.Release|x64.ActiveCfg = Release|Any CPU + {4F74387F-7101-428C-B918-38BC5ACCB0A6}.Release|x64.Build.0 = Release|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.Debug|x64.ActiveCfg = Debug|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.Debug|x64.Build.0 = Debug|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.DIALOGFLOW|Any CPU.ActiveCfg = Debug|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.DIALOGFLOW|Any CPU.Build.0 = Debug|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.DIALOGFLOW|x64.ActiveCfg = Debug|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.DIALOGFLOW|x64.Build.0 = Debug|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.Release|Any CPU.Build.0 = Release|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.Release|x64.ActiveCfg = Release|Any CPU + {0F34140A-3714-4586-8A8C-3ABA56221D06}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/README.rst b/README.rst index 3b7d68e7..4318d5ed 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -The Open Source AI Bot Platform Builder +The Open Source AI Chatbot Platform Builder ====================================================== .. image:: https://img.shields.io/badge/gitter-join%20chat-brightgreen.svg @@ -58,6 +58,16 @@ You can use docker compose to run BotSharp quickly, make sure you've got `Docker Point your web browser at http://localhost:3000 and enjoy BotSharp with Articulate-UI. +Extension Libraries +----------------- +BotSharp uses component design, the kernel is kept to a minimum, and business functions are implemented by external components. The modular design also allows contributors to better participate. + +* BotSharp platform emulator extension which is compatible with RASA NLU. `botsharp-rasa`_ +* BotSharp platform emulator extension which is compatible with Google Dialogflow. `botsharp-dialogflow`_ +* BotSharp platform emulator extension which is compatible with Articulate AI. `botsharp-articulate`_ +* A channel module of BotSharp for Facebook Messenger. `botsharp-channel-fbmessenger`_ +* A channel module of BotSharp for Tencent Weixin. `botsharp-channel-weixin`_ +* Articulate UI customized for BotSharp NLU. `articulate-ui`_ Documents --------- @@ -82,4 +92,9 @@ Scan to join group in Wechat .. _gitter: https://gitter.im/botsharpcore/Lobby .. _license: https://raw.githubusercontent.com/Oceania2018/BotSharp/master/LICENSE .. _botsharpnuget: https://www.nuget.org/packages/BotSharp.Core - +.. _botsharp-rasa: https://github.com/Oceania2018/botsharp-rasa +.. _botsharp-dialogflow: https://github.com/Oceania2018/botsharp-dialogflow +.. _botsharp-articulate: https://github.com/Oceania2018/botsharp-articulate +.. _botsharp-channel-fbmessenger: https://github.com/Oceania2018/botsharp-channel-fbmessenger +.. _botsharp-channel-weixin: https://github.com/Oceania2018/botsharp-channel-weixin +.. _articulate-ui: https://github.com/Oceania2018/articulate-ui diff --git a/README_zh.rst b/README_zh.rst index cb4bda67..2677ebb6 100644 --- a/README_zh.rst +++ b/README_zh.rst @@ -57,6 +57,15 @@ You can use docker compose to run BotSharp quickly, make sure you've got `Docker Point your web browser at http://localhost:3000 and enjoy BotSharp with Articulate-UI. +Extension Libraries +----------------- +BotSharp uses component design, the kernel is kept to a minimum, and business functions are implemented by external components. The modular design also allows contributors to better participate. + +* BotSharp platform emulator extension which is compatible with RASA NLU. `botsharp-rasa`_ +* BotSharp platform emulator extension which is compatible with Google Dialogflow. `botsharp-dialogflow`_ +* BotSharp platform emulator extension which is compatible with Articulate AI. `botsharp-articulate`_ +* A channel module of BotSharp for Facebook Messenger. `botsharp-channel-fbmessenger`_ +* A channel module of BotSharp for Tencent Weixin. `botsharp-channel-weixin`_ Documents --------- @@ -81,4 +90,9 @@ Scan to join group in Wechat .. _gitter: https://gitter.im/botsharpcore/Lobby .. _license: https://raw.githubusercontent.com/Oceania2018/BotSharp/master/LICENSE .. _botsharpnuget: https://www.nuget.org/packages/BotSharp.Core +.. _botsharp-rasa: https://github.com/Oceania2018/botsharp-rasa +.. _botsharp-dialogflow: https://github.com/Oceania2018/botsharp-dialogflow +.. _botsharp-articulate: https://github.com/Oceania2018/botsharp-articulate +.. _botsharp-channel-fbmessenger: https://github.com/Oceania2018/botsharp-channel-fbmessenger +.. _botsharp-channel-weixin: https://github.com/Oceania2018/botsharp-channel-weixin diff --git a/docs/static/logos/WechatQRCode.png b/docs/static/logos/WechatQRCode.png index 0aa1bee0..50deb49d 100644 Binary files a/docs/static/logos/WechatQRCode.png and b/docs/static/logos/WechatQRCode.png differ