From 9e1f6426387eb41925c3eb8ca992116bbac5914e Mon Sep 17 00:00:00 2001 From: Ricardo Carneiro Date: Thu, 28 Nov 2024 22:09:05 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20primeira=20vers=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AdapterWithErrorHandler.cs | 33 ++++++ Bot/ChatIABot.cs | 62 +++++++++++ Config.cs | 8 ++ Controllers/BotController.cs | 30 +++++ IAChat.csproj | 15 +++ IAChat.sln | 31 ++++++ MSGraph/TokenManager.cs | 49 +++++++++ MSGraph/akjkpvjm.5o3~ | 51 +++++++++ Program.cs | 49 +++++++++ Properties/launchSettings.json | 25 +++++ TeamsApp/README.md | 28 +++++ TeamsApp/TeamsApp.ttkproj | 9 ++ TeamsApp/appPackage/color.png | Bin 0 -> 5131 bytes TeamsApp/appPackage/manifest - Copy.json | 46 ++++++++ TeamsApp/appPackage/manifest.json | 46 ++++++++ .../appPackage/manifest.json~RFc8742a7.TMP | 46 ++++++++ .../appPackage/manifest.json~RFc97232b.TMP | 46 ++++++++ TeamsApp/appPackage/outline.png | Bin 0 -> 327 bytes TeamsApp/appPackage/technical-support192.png | Bin 0 -> 10310 bytes TeamsApp/appPackage/technical-support32.png | Bin 0 -> 1703 bytes TeamsApp/appPackage/technical-support32n.png | Bin 0 -> 1703 bytes TeamsApp/env/.env.dev | 15 +++ TeamsApp/env/.env.local | 16 +++ TeamsApp/infra/azure.bicep | 73 +++++++++++++ TeamsApp/infra/azure.parameters.json | 21 ++++ TeamsApp/infra/botRegistration/azurebot.bicep | 37 +++++++ TeamsApp/infra/botRegistration/readme.md | 1 + TeamsApp/launchSettings.json | 15 +++ TeamsApp/teamsapp.local.yml | 74 +++++++++++++ TeamsApp/teamsapp.yml | 103 ++++++++++++++++++ appsettings.TestTool.json | 12 ++ appsettings.json | 16 +++ 32 files changed, 957 insertions(+) create mode 100644 AdapterWithErrorHandler.cs create mode 100644 Bot/ChatIABot.cs create mode 100644 Config.cs create mode 100644 Controllers/BotController.cs create mode 100644 IAChat.csproj create mode 100644 IAChat.sln create mode 100644 MSGraph/TokenManager.cs create mode 100644 MSGraph/akjkpvjm.5o3~ create mode 100644 Program.cs create mode 100644 Properties/launchSettings.json create mode 100644 TeamsApp/README.md create mode 100644 TeamsApp/TeamsApp.ttkproj create mode 100644 TeamsApp/appPackage/color.png create mode 100644 TeamsApp/appPackage/manifest - Copy.json create mode 100644 TeamsApp/appPackage/manifest.json create mode 100644 TeamsApp/appPackage/manifest.json~RFc8742a7.TMP create mode 100644 TeamsApp/appPackage/manifest.json~RFc97232b.TMP create mode 100644 TeamsApp/appPackage/outline.png create mode 100644 TeamsApp/appPackage/technical-support192.png create mode 100644 TeamsApp/appPackage/technical-support32.png create mode 100644 TeamsApp/appPackage/technical-support32n.png create mode 100644 TeamsApp/env/.env.dev create mode 100644 TeamsApp/env/.env.local create mode 100644 TeamsApp/infra/azure.bicep create mode 100644 TeamsApp/infra/azure.parameters.json create mode 100644 TeamsApp/infra/botRegistration/azurebot.bicep create mode 100644 TeamsApp/infra/botRegistration/readme.md create mode 100644 TeamsApp/launchSettings.json create mode 100644 TeamsApp/teamsapp.local.yml create mode 100644 TeamsApp/teamsapp.yml create mode 100644 appsettings.TestTool.json create mode 100644 appsettings.json diff --git a/AdapterWithErrorHandler.cs b/AdapterWithErrorHandler.cs new file mode 100644 index 0000000..45479d7 --- /dev/null +++ b/AdapterWithErrorHandler.cs @@ -0,0 +1,33 @@ +using Microsoft.Bot.Builder.Integration.AspNet.Core; +using Microsoft.Bot.Builder.TraceExtensions; +using Microsoft.Bot.Connector.Authentication; +using Microsoft.Bot.Schema; + +namespace IAChat; + +public class AdapterWithErrorHandler : CloudAdapter +{ + public AdapterWithErrorHandler(BotFrameworkAuthentication auth, ILogger logger) + : base(auth, logger) + { + OnTurnError = async (turnContext, exception) => + { + // Log any leaked exception from the application. + // NOTE: In production environment, you should consider logging this to + // Azure Application Insights. Visit https://aka.ms/bottelemetry to see how + // to add telemetry capture to your bot. + logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); + + // Only send error message for user messages, not for other message types so the bot doesn't spam a channel or chat. + if (turnContext.Activity.Type == ActivityTypes.Message) + { + // Send a message to the user + await turnContext.SendActivityAsync("The bot encountered an error or bug."); + await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code."); + + // Send a trace activity, which will be displayed in the Bot Framework Emulator + await turnContext.TraceActivityAsync("OnTurnError Trace", exception.Message, "https://www.botframework.com/schemas/error", "TurnError"); + } + }; + } +} \ No newline at end of file diff --git a/Bot/ChatIABot.cs b/Bot/ChatIABot.cs new file mode 100644 index 0000000..303a914 --- /dev/null +++ b/Bot/ChatIABot.cs @@ -0,0 +1,62 @@ +using IAChat.MSGraph; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Teams; +using Microsoft.Bot.Schema; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Web; + +namespace IAChat.Bot; + +public class ChatIABot : TeamsActivityHandler +{ + private readonly IHttpClientFactory clientFactory; + private readonly TokenManager tokenManager; + + //public ChatIABot(IHttpClientFactory clientFactory, IConfigurationManager configuration) + public ChatIABot(IServiceProvider serviceProvider) + { + this.clientFactory = serviceProvider.GetService(); + this.tokenManager = serviceProvider.GetService(); + } + protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) + { + string messageText = turnContext.Activity.RemoveRecipientMention()?.Trim(); + var userId = turnContext.Activity.From.Id; + var userName = turnContext.Activity.From.Name; + var tenantId = turnContext.Activity.Conversation.TenantId; + var aadObjectId = turnContext.Activity.From.AadObjectId; + + var token = await tokenManager.ObterToken(userId); + var replyText = await GetMessage(token, messageText); + await turnContext.SendActivityAsync(MessageFactory.Text(replyText), cancellationToken); + } + + protected override async Task OnMembersAddedAsync(IList membersAdded, ITurnContext turnContext, CancellationToken cancellationToken) + { + var welcomeText = "Olá! Eu sou o Ian. Uma inteligência artificial interna da Domvs iT.\nSe perguntar algo sobre o conteúdo do SahePoint da Domvs, eu conseguirei responder."; + foreach (var member in membersAdded) + { + if (member.Id != turnContext.Activity.Recipient.Id) + { + await turnContext.SendActivityAsync(MessageFactory.Text(welcomeText), cancellationToken); + } + } + } + + private async Task GetMessage(string jwt, string message) + { + var httpClient = this.clientFactory.CreateClient(); + var content = ""; + using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, $"http://localhost:5020/Chat?Message={HttpUtility.UrlEncode(message)}")) + { + requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", jwt); + + var responseGet = await httpClient.SendAsync(requestMessage); + content = responseGet.Content.ReadAsStringAsync().Result; + } + + return content; + } +} + diff --git a/Config.cs b/Config.cs new file mode 100644 index 0000000..e20860e --- /dev/null +++ b/Config.cs @@ -0,0 +1,8 @@ +namespace IAChat +{ + public class ConfigOptions + { + public string BOT_ID { get; set; } + public string BOT_PASSWORD { get; set; } + } +} diff --git a/Controllers/BotController.cs b/Controllers/BotController.cs new file mode 100644 index 0000000..ec9c1a8 --- /dev/null +++ b/Controllers/BotController.cs @@ -0,0 +1,30 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Integration.AspNet.Core; + +namespace IAChat.Controllers; + +// This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot +// implementation at runtime. Multiple different IBot implementations running at different endpoints can be +// achieved by specifying a more specific type for the bot constructor argument. +[Route("api/messages")] +[ApiController] +public class BotController : ControllerBase +{ + private readonly IBotFrameworkHttpAdapter Adapter; + private readonly IBot Bot; + + public BotController(IBotFrameworkHttpAdapter adapter, IBot bot) + { + Adapter = adapter; + Bot = bot; + } + + [HttpPost, HttpGet] + public async Task PostAsync() + { + // Delegate the processing of the HTTP POST to the adapter. + // The adapter will invoke the bot. + await Adapter.ProcessAsync(Request, Response, Bot); + } +} \ No newline at end of file diff --git a/IAChat.csproj b/IAChat.csproj new file mode 100644 index 0000000..855ec8e --- /dev/null +++ b/IAChat.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + + + + + + + + + + diff --git a/IAChat.sln b/IAChat.sln new file mode 100644 index 0000000..a5363af --- /dev/null +++ b/IAChat.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.11.35327.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IAChat", "IAChat.csproj", "{1E07A203-25BE-4F59-B865-F4A08D776E74}" +EndProject +Project("{A9E3F50B-275E-4AF7-ADCE-8BE12D41E305}") = "TeamsApp", "TeamsApp\TeamsApp.ttkproj", "{71A41EF5-AC32-4E43-A247-FF63E7F0CF39}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1E07A203-25BE-4F59-B865-F4A08D776E74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1E07A203-25BE-4F59-B865-F4A08D776E74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E07A203-25BE-4F59-B865-F4A08D776E74}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1E07A203-25BE-4F59-B865-F4A08D776E74}.Release|Any CPU.Build.0 = Release|Any CPU + {71A41EF5-AC32-4E43-A247-FF63E7F0CF39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {71A41EF5-AC32-4E43-A247-FF63E7F0CF39}.Debug|Any CPU.Build.0 = Debug|Any CPU + {71A41EF5-AC32-4E43-A247-FF63E7F0CF39}.Release|Any CPU.ActiveCfg = Release|Any CPU + {71A41EF5-AC32-4E43-A247-FF63E7F0CF39}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1DA1A381-FC1E-44CE-AAD5-E15F6F6BA5CA} + EndGlobalSection +EndGlobal diff --git a/MSGraph/TokenManager.cs b/MSGraph/TokenManager.cs new file mode 100644 index 0000000..92ae128 --- /dev/null +++ b/MSGraph/TokenManager.cs @@ -0,0 +1,49 @@ +using Microsoft.Identity.Client; + +namespace IAChat.MSGraph +{ + public class TokenManager + { + private readonly IConfiguration _configuration; + private readonly string _tenantId; + private readonly string _clientId; + + public TokenManager(IConfigurationManager configuration) + { + _configuration = configuration; + _tenantId = _configuration.GetSection("AppTenantId").Value; + _clientId = _configuration.GetSection("AppClientID").Value; + } + + + public async Task ObterToken(string userEmail) + { + // Configuração do contexto de autenticação + var app = PublicClientApplicationBuilder + .Create(_clientId) + .WithAuthority(AzureCloudInstance.AzurePublic, _tenantId) + .Build(); + + // Definir os escopos necessários + string[] scopes = new string[] { + "https://graph.microsoft.com/.default", + "User.Read" + }; + + try + { + var result = await app.AcquireTokenInteractive(scopes) + .WithLoginHint(userEmail) + .ExecuteAsync(); + + return result.AccessToken; + } + catch (Exception ex) + { + // Tratamento de erro + Console.WriteLine($"Erro ao obter token: {ex.Message}"); + return null; + } + } + } +} diff --git a/MSGraph/akjkpvjm.5o3~ b/MSGraph/akjkpvjm.5o3~ new file mode 100644 index 0000000..f5aa6aa --- /dev/null +++ b/MSGraph/akjkpvjm.5o3~ @@ -0,0 +1,51 @@ +using Microsoft.Identity.Client; + +namespace IAChat.MSGraph +{ + public class TokenManager + { + public class GetToken + { + private readonly IConfiguration _configuration; + private readonly string _tenantId; + private readonly string _clientId; + + public GetToken(IConfiguration configuration) + { + _configuration = configuration; + _tenantId = _configuration.GetSection("AppTenantId").Value; + _clientId = _configuration.GetSection("AppClientID").Value; + } + + public async Task ObterTokenParaTeams(string userEmail) + { + // Configuração do contexto de autenticação + var app = PublicClientApplicationBuilder + .Create(_clientId) + .WithAuthority(AzureCloudInstance.AzurePublic, _tenantId) + .Build(); + + // Definir os escopos necessários + string[] scopes = new string[] { + "https://graph.microsoft.com/.default", + "User.Read" + }; + + try + { + var result = await app.AcquireTokenInteractive(scopes) + .WithLoginHint(userEmail) + .ExecuteAsync(); + + return result.AccessToken; + } + catch (Exception ex) + { + // Tratamento de erro + Console.WriteLine($"Erro ao obter token: {ex.Message}"); + return null; + } + } + } + } +} diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..93505e4 --- /dev/null +++ b/Program.cs @@ -0,0 +1,49 @@ +using IAChat; +using IAChat.Bot; +using IAChat.MSGraph; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Integration.AspNet.Core; +using Microsoft.Bot.Connector.Authentication; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); +builder.Services.AddHttpClient("WebClient", client => client.Timeout = TimeSpan.FromSeconds(600)); +builder.Services.AddHttpContextAccessor(); + +builder.Services.AddHttpClient(); + +// Create the Bot Framework Authentication to be used with the Bot Adapter. +var config = builder.Configuration.Get(); +builder.Configuration["MicrosoftAppType"] = "MultiTenant"; +builder.Configuration["MicrosoftAppId"] = config.BOT_ID; +builder.Configuration["MicrosoftAppPassword"] = config.BOT_PASSWORD; +builder.Services.AddSingleton(); +builder.Services.AddSingleton(builder.Configuration); +builder.Services.AddScoped(); + +// Create the Bot Framework Adapter with error handling enabled. +builder.Services.AddSingleton(); + +// Create the bot as a transient. In this case the ASP Controller is expecting an IBot. +builder.Services.AddTransient(); + +var app = builder.Build(); + +if (app.Environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} +app.UseStaticFiles(); + +app.UseRouting(); + +//app.UseAuthentication(); +//app.UseAuthorization(); + +app.UseEndpoints(endpoints => +{ + endpoints.MapControllers(); +}); + +app.Run(); \ No newline at end of file diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json new file mode 100644 index 0000000..4343fa0 --- /dev/null +++ b/Properties/launchSettings.json @@ -0,0 +1,25 @@ +{ + "profiles": { + // Debug project within Teams + "Start Project": { + "commandName": "Project", + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:5130", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "hotReloadProfile": "aspnetcore" + }, + // Debug project within Teams App Test Tool + "Teams App Test Tool": { + "commandName": "Project", + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:5130", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "TestTool", + "TEAMSFX_NOTIFICATION_STORE_FILENAME": ".notification.testtoolstore.json" + }, + "hotReloadProfile": "aspnetcore" + }, + } +} \ No newline at end of file diff --git a/TeamsApp/README.md b/TeamsApp/README.md new file mode 100644 index 0000000..f680e12 --- /dev/null +++ b/TeamsApp/README.md @@ -0,0 +1,28 @@ +# Welcome to Teams Toolkit! + +## Quick Start +1. In the debug dropdown menu, select Dev Tunnels > Create A Tunnel (set authentication type to Public) or select an existing public dev tunnel +
![image](https://raw.githubusercontent.com/OfficeDev/TeamsFx/dev/docs/images/visualstudio/debug/create-devtunnel-button.png) +2. Right-click the 'TeamsApp' project in Solution Explorer and select Teams Toolkit > Prepare Teams App Dependencies +3. If prompted, sign in to Visual Studio with a Microsoft 365 work or school account +4. Press F5, or select Debug > Start Debugging menu in Visual Studio to start your app +
![image](https://raw.githubusercontent.com/OfficeDev/TeamsFx/dev/docs/images/visualstudio/debug/debug-button.png) +5. In the opened web browser, select Add button to test the app in Teams +6. In the message input field, type and send anything to your bot to get a response + +## Debug in Test Tool +Teams App Test Tool allows developers test and debug bots locally without needing Microsoft 365 accounts, development tunnels, or Teams app and bot registration. See https://aka.ms/teams-toolkit-vs-test-tool for more details. + +## Run the app on other platforms + +The Teams app can run in other platforms like Outlook and Microsoft 365 app. See https://aka.ms/vs-ttk-debug-multi-profiles for more details. + +## Get more info + +New to Teams app development or Teams Toolkit? Explore Teams app manifests, cloud deployment, and much more in the https://aka.ms/teams-toolkit-vs-docs. + +## Report an issue + +Select Visual Studio > Help > Send Feedback > Report a Problem. +Or, create an issue directly in our GitHub repository: +https://github.com/OfficeDev/TeamsFx/issues diff --git a/TeamsApp/TeamsApp.ttkproj b/TeamsApp/TeamsApp.ttkproj new file mode 100644 index 0000000..443dfc4 --- /dev/null +++ b/TeamsApp/TeamsApp.ttkproj @@ -0,0 +1,9 @@ + + + + 71a41ef5-ac32-4e43-a247-ff63e7f0cf39 + + + + + \ No newline at end of file diff --git a/TeamsApp/appPackage/color.png b/TeamsApp/appPackage/color.png new file mode 100644 index 0000000000000000000000000000000000000000..2d7e85c9e9886c96e20fbb469c3c196ae8b5de42 GIT binary patch literal 5131 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 literal 0 HcmV?d00001 diff --git a/TeamsApp/appPackage/manifest - Copy.json b/TeamsApp/appPackage/manifest - Copy.json new file mode 100644 index 0000000..203cb7b --- /dev/null +++ b/TeamsApp/appPackage/manifest - Copy.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.17/MicrosoftTeams.schema.json", + "manifestVersion": "1.17", + "version": "1.0.0", + "id": "${{TEAMS_APP_ID}}", + "developer": { + "name": "Teams App, Inc.", + "websiteUrl": "https://www.example.com", + "privacyUrl": "https://www.example.com/privacy", + "termsOfUseUrl": "https://www.example.com/termofuse" + }, + "icons": { + "color": "color.png", + "outline": "outline.png" + }, + "name": { + "short": "IAChat${{APP_NAME_SUFFIX}}", + "full": "full name for IAChat" + }, + "description": { + "short": "Short description of IAChat", + "full": "Full description of IAChat" + }, + "accentColor": "#FFFFFF", + "bots": [ + { + "botId": "${{BOT_ID}}", + "scopes": [ + "personal", + "team", + "groupChat" + ], + "supportsFiles": false, + "isNotificationOnly": false + } + ], + "composeExtensions": [ + ], + "configurableTabs": [], + "staticTabs": [], + "permissions": [ + "identity", + "messageTeamMembers" + ], + "validDomains": [] +} \ No newline at end of file diff --git a/TeamsApp/appPackage/manifest.json b/TeamsApp/appPackage/manifest.json new file mode 100644 index 0000000..7f602ad --- /dev/null +++ b/TeamsApp/appPackage/manifest.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.17/MicrosoftTeams.schema.json", + "manifestVersion": "1.17", + "version": "1.0.0", + "id": "${{TEAMS_APP_ID}}", + "developer": { + "name": "Jobmaker.com.br", + "websiteUrl": "https://jobmaker.com.br", + "privacyUrl": "https://jobmaker.com.br/privacy", + "termsOfUseUrl": "https://jobmaker.com.br/termofuse" + }, + "icons": { + "color": "technical-support192.png", + "outline": "outline.png" + }, + "name": { + "short": "Ian - ${{APP_NAME_SUFFIX}}", + "full": "Ian é um robô com inteligência artificial para realizar tarefas internas à Domvs iT" + }, + "description": { + "short": "Ian é um robô interno Domvs iT", + "full": "Ian é um robô com inteligência artificial para realizar tarefas internas à Domvs iT" + }, + "accentColor": "#FFFFFF", + "bots": [ + { + "botId": "${{BOT_ID}}", + "scopes": [ + "personal", + "team", + "groupChat" + ], + "supportsFiles": false, + "isNotificationOnly": false + } + ], + "composeExtensions": [ + ], + "configurableTabs": [], + "staticTabs": [], + "permissions": [ + "identity", + "messageTeamMembers" + ], + "validDomains": [] +} \ No newline at end of file diff --git a/TeamsApp/appPackage/manifest.json~RFc8742a7.TMP b/TeamsApp/appPackage/manifest.json~RFc8742a7.TMP new file mode 100644 index 0000000..c08f239 --- /dev/null +++ b/TeamsApp/appPackage/manifest.json~RFc8742a7.TMP @@ -0,0 +1,46 @@ +{ + "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.17/MicrosoftTeams.schema.json", + "manifestVersion": "1.17", + "version": "1.0.0", + "id": "${{TEAMS_APP_ID}}", + "developer": { + "name": "Jobmaker.com.br", + "websiteUrl": "https://jobmaker.com.br", + "privacyUrl": "https://jobmaker.com.br/privacy", + "termsOfUseUrl": "https://jobmaker.com.br/termofuse" + }, + "icons": { + "color": "color.png", + "outline": "technical-support32.png" + }, + "name": { + "short": "Ian - ${{APP_NAME_SUFFIX}}", + "full": "Ian é um robô com inteligência artificial para realizar tarefas internas à Domvs iT" + }, + "description": { + "short": "Ian é um robô com inteligência artificial para realizar tarefas internas à Domvs iT", + "full": "Ian é um robô com inteligência artificial para realizar tarefas internas à Domvs iT" + }, + "accentColor": "#FFFFFF", + "bots": [ + { + "botId": "${{BOT_ID}}", + "scopes": [ + "personal", + "team", + "groupChat" + ], + "supportsFiles": false, + "isNotificationOnly": false + } + ], + "composeExtensions": [ + ], + "configurableTabs": [], + "staticTabs": [], + "permissions": [ + "identity", + "messageTeamMembers" + ], + "validDomains": [] +} \ No newline at end of file diff --git a/TeamsApp/appPackage/manifest.json~RFc97232b.TMP b/TeamsApp/appPackage/manifest.json~RFc97232b.TMP new file mode 100644 index 0000000..936c056 --- /dev/null +++ b/TeamsApp/appPackage/manifest.json~RFc97232b.TMP @@ -0,0 +1,46 @@ +{ + "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.17/MicrosoftTeams.schema.json", + "manifestVersion": "1.17", + "version": "1.0.0", + "id": "${{TEAMS_APP_ID}}", + "developer": { + "name": "Jobmaker.com.br", + "websiteUrl": "https://jobmaker.com.br", + "privacyUrl": "https://jobmaker.com.br/privacy", + "termsOfUseUrl": "https://jobmaker.com.br/termofuse" + }, + "icons": { + "color": "technical-support192.png", + "outline": "technical-support32.png" + }, + "name": { + "short": "Ian - ${{APP_NAME_SUFFIX}}", + "full": "Ian é um robô com inteligência artificial para realizar tarefas internas à Domvs iT" + }, + "description": { + "short": "Ian é um robô interno Domvs iT", + "full": "Ian é um robô com inteligência artificial para realizar tarefas internas à Domvs iT" + }, + "accentColor": "#FFFFFF", + "bots": [ + { + "botId": "${{BOT_ID}}", + "scopes": [ + "personal", + "team", + "groupChat" + ], + "supportsFiles": false, + "isNotificationOnly": false + } + ], + "composeExtensions": [ + ], + "configurableTabs": [], + "staticTabs": [], + "permissions": [ + "identity", + "messageTeamMembers" + ], + "validDomains": [] +} \ No newline at end of file diff --git a/TeamsApp/appPackage/outline.png b/TeamsApp/appPackage/outline.png new file mode 100644 index 0000000000000000000000000000000000000000..245fa194db6e08d30511fdbf26aec3c6e2c3c3c8 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z9;9t*EM+Qm zy2D^Lfp=fIpwQyAe|y)?x-or<+J~Ptr@l6Mq%piHi4jOQ$W@+cm^^pek{T^R1~YT6 z#nC6He`LE*@cXCq-bL3hdgYxF$=uQYd!tVN6U(~0f70B<4PQ*lTGqqND0QE8cCxF; zrA^=emkHKQ+WI8@(#FJB4wBw$4jk;^oXcu!J2!Q;MX2;5u|xv~4xueIx7{LTWE)P* zx>U9|_qXolm|MHJvl^rhh$n1mem7%r%A<3y&veM1y2!zda7l7b Ve3c}0;w{jh44$rjF6*2UngINOfUy7o literal 0 HcmV?d00001 diff --git a/TeamsApp/appPackage/technical-support192.png b/TeamsApp/appPackage/technical-support192.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a00e0c8791a059bb99af88d51fbff92627d60f GIT binary patch literal 10310 zcmaKSWl)?=u=Nt$7IzJvpuycWI0^3Vu!|Gib&+6!;1D3e-GbZV4nY@pf(BjStF`Kc`YI6IwG^ZQ zRTGqluN@>?DOD)|pf(W`ZjSugM+YhDy8{5g-v1f`5zEJ50DyT#NmlB!kI88cxmhx>$Y?mioj z?F3$gbb*EyOP1&7e&}QU{-b|e$)V0FyGF96>f#WDnwoEt#X?FbSZ@9#!dP}OQK5!( zhC&PD5asaAyI?D+(DXZ6m+(QDgA$Jwjg^2EvlW4r7@-N~{+gD)=EN15y1cNY_P<_f zybg&_dfHMcwb1J@kBA*qF>r;RSu9C$v^B%02jJJ&DH<+COQe>d5#|Bp;Ja(xx|gk|v?QBWwGJ zb5B@2NKwmvnRG8dqb4c8rG&o6p9Df*q@Ix!zPV;!2**&4=V0jfq{nHxG5!f3tVtmNRu>M?TdEUL z^U2S<8{F%D9%-sx!D4Eedx??@4z{P^99wu2ZWpfjcOU$5Q~VBe>fKf)!3`ceXSzyl zzX(UnU#RZhM1YcRhxeY2g{a6k+m(=ca#nc(NX1L3R?%A#dw-%~oOOp>KDCuRIcy!6 zW3}Ti3IpPU(13|jgA~j&sHk7E4f~jK6mGnICm^?wKW9X9f7Vda!&zW?x@>%)UWHYUe;lp;{N0KF^T^=8wf zg;|}uzo+~3N4@n*Chi$nG+`GSqK10wANSk|Cmg*%f>@fQ5=?mE|J6sS|2AwSwg9!l z#{e9G_<7vqkBmo-yXs(;Ej~s&D~*haqzkNy(ztV8u-q=gzMlAcimw&WN`=p|VmqQrrO6aUj1N_h`CevtkMEhQ6!jV9U-$*Ieq?po)tm7JZWX!b zdfKnE`2{LK`!-jdHjb90NV#Dmz9gza7=Y4FnR=lq{8$td8aAKt7N-D|L2gS3*3=ez zvHCWWhzI9qSP{%5O)t`E16j!3zh}*Lo7n?s&tpCodS7ycB98N*Z#qNQxZn{spOY0e z%)vEdQYUhQG5t08mqZ6_?4MX>wgB4o#Hm{&{!3egS1POiz*fYFyGSx^1_Hr1R2z#) zvW=_C<~Sr~{)4yapFWOIb$_AB;FECe8Nh^TeUY8LHdP}P6Ww07Rb?*g$1oT3|2SEt zNoT^IQyKT17DM!N-tr^W##(FKn-IloZ6t!}@Va3*p2L&(SQ#BvKA#{?)X-ZaD_WEF zvDlFxwt1Slb>7LJgcGR;UvPmjT+aerKIBF55>Jw-FS6`km_lO?0!{vG5iBc?C}tw& zmuwuz3S`!{v@9-uyM@FM?XFa|(2c8nF^o-%5_mn?^C9orJwUtEp8)tTmPk!d z$vybjQN#e9uqk9)`9!TO3RI<-MyBn9Cx~F1aS7Dy1ow&`n-v#vO;t5+p)T=L)=icdhvK1i5nZU5*h%RA_=dLEGnIJT~8P=mP`b zzVuO7X>;Mp=N!24d2utse9yjif1mp>ScR#ZCHFF=RkX|uHiAEgb0?dLJCJf`>Q z4tAQDQ9CR(AHAdHbcs&Gbb>$qT1o?RvzQRiTkW(Kjo#<8y=7=X4!)?r@%}RT!eI@k zqB;16i6#c9*ew8(JGMR#H z+5Fukb|=!`AG63j)acqISBpkDzI(3y@%mICN#(#6cWCvf&D`XT1{MNj(XQWk)cqbF zB^ZCslYX046m|9Vx9i&n!}wgA<$TL6X9Onc%Q3UDhVEU{nqCY!3Mb?f4%NKUzMzU4 z`YlfYGs#QY>yd0bs}@8$ZtYgE86!Rf1Fj&P3Tt^SUg$rwI%x5>iRJLW>4-^~tO?da zG;8FB9?1lAv16ZKS_R>=@dH>2@ZEDSL(Br5af76&RFhCzT?#?!Ue(3)7>=My%1`5HG7lPF~J|~iO@FGxP(Nd|(b#7>6oWL$+yDfW?jro16PNXSj2%$y4 zaV;XLgucLEf!F5OuYDW^?w4>gzeiM%+AtxdOL+xpk7pR+yElyiO)laCT?jL|RMSaa zuAa^oC|(0fZeDqp>oLcmT9cLjS*z)*Q;Sh$P14eQr`Fi(Wd2FBhoJDj+1dSZ)w>nv z*qcoLfMk^I{S{*Y>4eXJvu|H;K1DTwE~#4x40%C2fP=4u8{KOtr`^jBGCV#`C6l?6 zL{T&$pb9WsRcs`pnrY*wKeCgMOU7Hh^@;Z(qTB)NZ$!!!uB^%0dBUPpaypXu?I{$1 z`HnM)s4k86QS5gnV}1kjaw4dxBC4AVf=ssq+6>9|?(y8YR)ZE6M!ZhPL`##jUbo=m zpNC((S)DKyfWiEUI5a0NY4sjk2bX^`T4y0dQKwu;=*O=YRY^LL)Y_@}U!s1-!RV~~ ziHq}qry`XYuDdV_sE!AUe@x2iWPKtTrLsG?oEc-2TDvwfS;cX>j8S`>ilRo9-|X2C zwx%LPHYYruNavOPsy`E4TAhkf73L>xpVbg5`}rYEY2fh4GWL&>9GUx6s<_G;3N&)DwOh}cvG_r9sS zuZReVUv*t!c02kYR@D^)P=eR;Lk}PQWRIuQDPxVp>K^E?Ega`@jrPST1=qxNZu-6{yuKFugDW4l`w`Rz zLPlwpTZwKkFoFq6ESRQ&0GY`}*=?)xSz4oxDw<-F@alzHxgzPDb;5J<-|u=Z9l~o$ z*3dSQ2CS0?vP!BCVfEq4+SKwGRKedZjBExi3emYS7Hd75r(+O72}4fNIi*#T^yaYI z-Ve!WsCtcHznBtx|E#f$n^q^xTUHJAxJ01oM}5qK1fiANu)3M8uxi$lDTLgM+K4pG?EDypAOWWhy+(%NP8J36#s=+7F_}9hP*jjLI3us zw4*x`1)Gm|tk~rILELmX=Hw$@4wHWw{qe*s(tNpV9eKn@`JFcp#W~X?hsVd0{|?CY zz%>py`kgym^P{O!ovlq+uIs4>26}KuepkXf;%%vdk!jG7ipv~H4oyBYvzPgTYYgTEE_-O`O)X79 zU}v|fCZd~w$crMgxVSdow$@Xq2J;+t4lV9^0zu0s{C_go(fc284LD{n+B){ zUyKR}J&sa8ZdIqlZ7=>|&;zU@wxYmARa6rcc)zNx$)#l4`d2zw`G z&e;i3F3vH6t3grjYPgZ%dJ6KZNiU(QsYYa55%X6prxRT=SyxzlX=N?vJLWh%=k#lr zl6vB3=Xy7MRtNL%N|2;Zr3o`;dPUNtPF2RhvG>Swn|yK^$C|M9=({ycE6KdSZX-#7 zZZjL)hf76zb@gHRF|sK~-_*FUVa(&>m36+yUiwY`jciZ;kP3rl)pVy7*7h5L+3g>$ z=2cjyYpRi0C+xeWz^@2TkBa+hzVd;En(fD$17i-x4Lm5R#9*4>Z~qY`W6P6M(O-_1 z?}xDJ8+9rSsW$8>TORbJ?RoqcLg(E{Mpv}mt(J!z$F&X!35Rc#apimMFtL9Vp-dAJ z{|vhxOF3rBrhDPPz!Cz3f`%sw=|L!759ZFW)tUEs0Vec8ey$~O-({_2c5J!`gk(y^ zDQ11BfN>Mi1pBz+?XwPPJT#o=ab)qmg3mZ_^aPFaRe{oxR{$W@T_4RVQ z1t_lAi{LvqZvPc~+zCtEAD*oapv@bHG0likgf-GWy9S)I@b-b|{50eE54jJIFz)x{ z_CKDPh?#L}lB#?$K%~jhz8Zdj81AMCl#HbAPuuMkR+}cVFWtdv^AiR5d+?h0M)NQ6 z?|T?6tylHwr>zgO<8=}wbkLcj?W68K3k8=C0{9wNzU7)q;@iM0{@Lf(@3SWx23@qQ zet9(A;qgGfeArWF5#Zlu<}I573w@mxQ^@tPPdD;EKHGJD$$tBIOaVbR|E>0GqtR#l z36*@8<}83EL+!ak#n--M=NgU7K7Qa1{c3{SOuyn!r#jQiiFNDl-=X-0Wb45m_c!K+ ze@$w^apg`E+A+z*H2Yb3*793XIF>gjYn+q6?;?#p*vICa?oX5VD7cXl?=XfpQI6pe60Ec1mkEbcDFtKj@|NY1?bc#6pI?8 z&@8?oMZ|VIdEHP2|7X254Dz<*kJRj&dPN1bN=+^+Z{yOdlA24$Qxa{eNDi|Y3pBP& z-Qs8=X4f*_j8FDh%5^()=|JOz3sn4>A|{v7E55C1OQK<+!=Ozf!0~yoWE-j;*F`9e3B%&8|J!>ExF1w>J1=Y8*987um%8 zh@qC={tA&f!g{@%;X*xv@yOyey{BJefZfL1&K-g<>IzQ@{kxw=H&+stJIi$U2ir_5 zcU_8v@~g788^-AJxMN=u2%n;<Er*eUu_u(#zrNKMh2cPai6QEG}9eQSEla75qZi_#|F%Iat5s3ba7|qJ^ zLXzVpr)$ZCo!!)U;#n89@$a4(Q0VF1Zh`d= zxs{4L^OhS94fDW&6c`DS2tHPRtjPPp8AdRfM7tQDqW~29Rt!-_x$A;}TpbsMGW0|J zDE?7=l`^<0ye&#))0pC;VfM?m?VY}`WELc^2J5PBTB{(U?YYzThs}7TELObo`KVP4gcuy|KT^Y&iFbc|Pt`!Jd`YGdq|V1D;iioK-;UWu0y?Dv2bH zh@9;Jvm4PisVGn1$8~b5-%WB9Zm`2f0g^qwJc4q_VH;DP%X|30l=7?c(Yk;0c+8n%3}QOH!4~8Ab_R|9Pm`TYI4VEC!cFc+?oz@xktlGWJ4ysQQLqlA#;UV#-i-;p z?^#^+^e5>oS?BA9HC;epnjL>VT{~~t6k~p(C6Rn(;?8(N@PLTR;B)F^bw|ym_cERz ztwMtpLo}w67_yMVr`;symdgP?oI9JMn|)xCQAE7o*mC6f#h6gs&WeEeTOl#GPr{00 zvhh;S3-Z1f7fNn}Wd#?jWERH44wCj4g>{BSMdmoJ8%Ep<;4N}Z3CW0+zt4oH2?%Cz z=Iw5F)f97hvB)an8nxJKAi4He7@Vw{oG|vhgz~r+#0+Z<=DmsMme-ev=Z1yUC2php z=uAy@OsG!fDTwOFeFOUo5vj?47mx4L!r9)psO6NRJZ&)#3vtVVPo23pwdzyMN@TOT z+q$IsV^I?Q46zo&v3`D5Frr@)I;ZMG!L@Rw&%6#v=|EZ$pNOR?7Q1~S>;JnqH~~$I z`)4`U{pP9bYG(De-XWv82;JI~75YW!O;gl|K9VD~8>y zcUDgjSaD?3C9ZBkeK>NKQg|2nS{$O<*)#ElBWo z{lC%{bn;{5W>QW{S4jm^}U@hn2@I zDw!3I?~2)?a<*@)S6bwXKfIlFQx(KmS!Aj6%!3XJC#(9&Io!sb2k2M#{VxcMq4bp| zITmmNZvhgVXp@WQ5l(t9ot?2qm$40nLYpQA(V20ZWMxHOur6RiN^cU^*q>3)aA6P_ zzOy1t@+nttG-@7qje0@@4^AgVm-Egrl;RTloBUJ#sd}yx%|WQJJ$96sz-t~C5%g!C z+$Bx>xcTC3s3!-|YavbtoP|W)q7W*u&hUISNd!B0yU>mQ+HIZjaigleKj>C9`}=X_ zLa_a=vViwXRC3g-hSZn)GV&EWj@9dce?b$xyk!~{SO7Ur0`HlN(l2q>9S~^QcG`sJ zMxF&R$zyMg4c_&9cO{19bHk})Lpy$PMyJ!@zl4MF?*^#o)-YtV#5Ryr=x5092Go;p zYUQarvpM(De1Yr!ad#ZwNxKM;cn_>-Jhlry_V!vD(~j$5SUu&U%$nuYbtyGm?Bcf^ zkta|19&l_J`2}d+_}_8QC57O(?4r#2Xx+^X@~cqHj5TnN%XcmxcYMHv)4X!>BZuk1 zw4p_+P!4`c<~hhB6T_Es%CQVb5o-(cgEzu4+ov@Rn?k73#~g@`!{Ty<|BmJZVRw4n8VxDx+!>-^ z3dIz!nV1sG6=dszv|O`PNPqoS*wDjEzaJ16rxK4e2xr>OjcVQlp0MzvT(Oib-1zg# z2lkx$_qLi@ zrpG%CV7`VGe&#N~2<+@lb@s!6`J_mI5?5#{w4_^j6XjcaB=Iy3DQmnSeLVM42MN2B zjVjj|8)~rIKZv26tCNRK_gzA#9|=nKI9fXt@mqQT2v9O^->JdGMzIT^B9lmMcZoXq z&M!PF^nUoDG%qX6ta}wt(o_$F8kS?j@K;cRj*14wWI97wDK|I~+K7J--FD0sCBLsMdrgVLJ%h+b) zc@imI6dfxop8dAY9_Mv0EiAM6Px)t|wv@Hx+^pezeDaw!PTY_&cR-cN6nQ$-^qH=X zBy3PGJ6OKXB_aD(;HqrfoG;a0DT+V^2y@{gc#YSp-Fax%6taw1p^|^n?BKF?)PoQgW0C#!rdM;N?gB&i!V(Mo+pW zewzFXboPDhi?seW6dx_DE6zKzz;xKA_o+D8hTMBj>FzI#_H;HG6;AyBi71{gB+!Ju zGEtmvTDOGUI{7DM#l*;6iND@Hljl2qis*LK96j7LSU|ZN##Me2>Gc?unNH;z%l`U# z{s%t+R=ma!`#sy-cOw;>j8bW@^ZN$D@)CLLI2O6s8(@gRB zmAB|zBRTj1LBtb{luOBX+{$WAcZ1p+S#qyLi1~pRORe?q&owZr?f73OT<1AjDBAQ# zWjPt~e;s~|Z9eD*l3089nMha%hWVm5`Rm`g^--=*iDrS^pN-cL@>ZX<3jCWEnG5E$ z2Y9Bx=6!PSvSH8?0+_QK!s4H~Y<;%`GQUxh`Xj{mxm2p(`E8cnxwdP<=@oi>^Nn`| z+AxfN!o9_&XCD zKA7GwK^-hcCP#ruZKG{u^voyfk0H74IIh66Dl5EZ4r{eQx|5dA8*)cO&ROGWx$y3UzjCCRQpUL)c!K zoi(CaH(GO}ljx=VXp$8E?^~A(n0Lw@2c;`opXksF*(7u49ThxM2c@*z^*w%~Td-9( zhXz6Wr_e_c;q?7ZeZI_k;hlR!?bN z(1R&@*QIVUq8+*qj(9qlS)y-pOJq~mls~YKwEz9r&{vnFnSGA5ugq6swGa04Y1FrE ze$GyHvAnv!$umvFH}injc{QX9foU+{oCyUlqJ*u9#EH8nhr8alhUb0JD!d|z>GZ=v zX&T?_NTC+bM98%o->&cG>z zLUwuObnfyknVHC%g;1FyFdfs>n;olBB}Bg%O3<@KJ6(??2{VqcR9yi@xeOsIqyga- z+r)f4?!xz-LRf&C6kVJNSPn;}6dd)1CYzlAyGIyVNt0%yfOtQz)@`t;@MKV@1`cIV zUm?yCfOnz!V||KHAh@P_?`_`#cIPUxfjw0Ukkg1}K@U<-6iwz8rX~aq&gO3`rQDF# zjct&o(s*5-%yu1+teig)ZHbYM4}`y5W2z|l z1CwMZ&34cDZia%a2el;2*+xboza4KU$j*3o_9J#mjycjkp^_*E7}vXn686^FWaf#M z=>>YMF-CHntUqlI{q#d0r91xozQy~WOeBP6r{=Hjcvz<{_%4i0nVbF6zf>(bQy$9X ze|!)=Lw(tu^TN@Gny&cNgmNqqYt>gr&0nKO{rgH-2DSD#!UAv{c`l$_)OH|cyr|~% zrLh;)-W!gGZ6`6fnP|giFUmS;clOW-bqJ^OY}Y$Se8{0qT;);f^gBG9scADIpF5o{ z?x}OuGvr(hvHQ#u*dklGMi7Q>fk%AxA(Kw{jnhpRD@>=UkxrfVj%rYe zwTf!`^c}}&X;7;?4DFuL;kk7DV3YC+Htq>UIvM+KoOP00O}n4&FTbWYu6U4YhUQ~dB6qDFV;vnxvcCHj_M zLx*Kjl8c2=ZfIBu@yl?M)YA{sJgxe!L`GfZcgo^9U7-DF=SyOzflZV%;8sPf9j&2o8_)}jqh3}I~na~w622BqH&ft zkP^2*DP-+9>VA{4d+;QZ7P7ci%Y6{*QD$4}Nl zSV)D7gGS?_Z4Xnvu(tdc4~A@4ouP2YU$TOdG?aVNvGD}x!4vt>c}T8-QRMnG`Z@-6 z6S2*s*GpHW8^2O2>{O8a9}e8*6TVr>Sr)EIfrKR?-EUea;~7!jt0}?1n*9|?zep*o zvKJl%cop+GdH>@g5dxq$JW%&-p4q5OBiu)s!sluoL1~EBhb!!bF@rX)5MTM}kd5Hm zht40y+ijkyc1F8^;vjoGS7T$K(9wbM<~uKG4h4aXHcz4|cR*-pRwANnhl_w3%WoC- z9sGl90-hrdqeB1^@(mtvUq<{t1r$Rynp$c)`Vz! z;t*EuQ$Xa+_*yo?U1NIz6zmni`%Uf!O_7OU-DIC|Ea17mk28Wrcy=H*guDqr;2Swa zb6ZbxL%Nmf>-x0VfH$T6%f@FAVoMpEFTWJg+hOWK7IKi5BtYwspDo@bRTkzd!<@Zx zb&Mbu=SB8%ftH)cTJy!-84u%y*La6l7FFttbjvp;67tUsz=`TjqbgP0PTh7rf&lQ# z%-7=8s;bwl@>0R#_gd2F#t&(hk=ll}-!xLJ39A^ifg3+LlBAREQW06W$#(&<@$y2! zbVZuLeCYo@G>+_sSCG6&7<<4h&HjWtt{&pWJN*MVM27922eZg^Lw&8a$nD>ZvSE{- zvl4XuDsq|Csezriy-%3^nvB&4JZh__g zdXP#S#_)nVsCAvxu(rFDVbLp^$Lh1Pfv@jLccEW31tIxY13LI(3a zh0{RT!onLqP3F#5c@QuULOj`R7_K&aC%c|r~}D=T^fCGmRy zo^`~Ty{oWI(jE{H$N_+h@a)m4Ty4WVlte*sw7>)B0!mtJ$=St?q^jrVWTiXdmUq?^ z4;oEpR_{<1Kj;@#*<`xUi^y4Iih)&HPa#{Wh{dE`c0=1-{qgVcp^gjF#3Kk=@g>SQ zl$T@Q=%mJOb1+~%(jY~f3q;}ay zI2XMRftEwc_tt#Abv=4yIz>>u`ZK^g7SKtJx;WN)!4)(w+in5>cFDy07i|}C7(yX1 z^gFF|3%6xuEYbbwxH?{4JgK7L6Tk$Jm!%I+MiQ6s9&q)$ls_71U=Z2;2?Yr za|2|2l{j+fQdh6~;!zg#vbt~72yT3>t79SjDY^54=;5r6JPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!Th@!>?BPxbejll@U zKPm)V5HL`IfEq-ws0c+;5!%|;vUPc#_H8qsb7x*@=>nCW*2q`ZMULB0dQUe@v75PGw=c&qfWPHKr9agW35&SC)R6jTcKS6 zaJUQNkkgarVf?z=z9}H?a}aBto=ipD@7;EX-TaCxxA#_Z!i}}v>9yuiXe|I$7C=k~ zL*R?l^)eWfv8TJa6xz}2^fUJibgH3-zwG+WU zhuqQ~U7MZsf$svwU@Yi}7FT-RoE=U9p^j#S% zHngP=d6&e88l3g0x^xC)X5@QNJ%iTO)ytP(?~%1{eJESE z@0JS}E-AgoV<@ss9mi-xTlzRQ9u?jQerrmjf$# zu0;yx=E}>f7QrSCUVl%h@kck}+mu zOot3sHp#;I`SR@2g_4+PNJWkJhpC(T4w;l{<;1Wf>LPk6qCB7@=N$A$)rNJc3UNiW zoM5v)#e-jezPwU4Zz~aBHjT*Y84 z#$;^fU@qolZe~BIx!H-iRt8EE*B`fn{yqBU_VAN+%H-52?e5Mq=+$bvPdFow%WL{4IRg5qfeNm zeCVrUbPZdbg08`mVN%~LcJ)8%8Ddpc;xtD@nz1CcjSks{PL09FuC7u(%D3amYX>#` z-GVXvUWvZHQS|)LVjVdy5{`+n>@nPnycmICP-5#olGq2E#4afjtK@|85gmnI2klC{ zb}e`ntH&44y3}3~YwKQY-yjkvh*eP``mG}s*`|(T$_BQ|hqKXo2|BnYhsFXhe-2b7 zu!#Gl_s4S($IWbxii!0!{fS~mEHS-aY5J^K>K|RA$ToFqj5f4|4}H_qohPM=3AR|8 zgsxT*)^e9yL($+po=Z)csZ}3*qVDA2KxBR>9F-lr_Q{@uCAht?lWEWv@k-SezY1!3 zCEq(OU*^o7flJ6Eu=(WvI*<=o|gb{)&R6#Mo|J`e#bZGsmo45NPi3qv9y5 ztQ`$e1WrUD{8IL?1i_7Oa~J*$K9ifBb>hI0V}+KjVUx(o;e#sg7&`d=SeFIFfkK8s z_?=$oK!NRxvyt4X*F@sKl@7og;2wxQ;3<5L$IP5OHgeqpdJ`z%ZixM0?-by_^AT=w zKDS4JJh1pa*~Yj)>X~(G9{&V0!)2hF;6vv=kgwv?C?Kyl3Rnffe_mQ)nh}{hahN={ za2_5eT34I*TRg{RvB7)bW>DkGtHAd)66I&wF30Wwr7dw+%K>m1sBp70K>v9lmq0xZ xaJG#=lIQHFMJslM!(p9|k+#4u$5k4K$bS}3k$(EIBYyw@002ovPDHLkV1fZjDQf@# literal 0 HcmV?d00001 diff --git a/TeamsApp/appPackage/technical-support32n.png b/TeamsApp/appPackage/technical-support32n.png new file mode 100644 index 0000000000000000000000000000000000000000..899922d426358eff495e7969411daeef43a555bf GIT binary patch literal 1703 zcmV;Y23YxtP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ9420TebK~z{rtygJm z6;&AhX6C*2^|ggU7arKMga*M#g#tne0tTuH7&M^#5~HBeL<|r>h@!>?BPxbejll@U zKPm)V5HL`IfEq-ws0c+;5!%|;vUPc#_H8qsb7x*@=>nCW*2q`ZMULB0dQUe@v75PGw=c&qfWPHKr9agW35&SC)R6jTcKS6 zaJUQNkkgarVf?z=z9}H?a}aBto=ipD@7;EX-TaCxxA#_Z!i}}v>9yuiXe|I$7C=k~ zL*R?l^)eWfv8TJa6xz}2^fUJibgH3-zwG+WU zhuqQ~U7MZsf$svwU@Yi}7FT-RoE=U9p^j#S% zHngP=d6&e88l3g0x^xC)X5@QNJ%iTO)ytP(?~%1{eJESE z@0JS}E-AgoV<@ss9mi-xTlzRQ9u?jQerrmjf$# zu0;yx=E}>f7QrSCUVl%h@kck}+mu zOot3sHp#;I`SR@2g_4+PNJWkJhpC(T4w;l{<;1Wf>LPk6qCB7@=N$A$)rNJc3UNiW zoM5v)#e-jezPwU4Zz~aBHjT*Y84 z#$;^fU@qolZe~BIx!H-iRt8EE*B`fn{yqBU_VAN+%H-52?e5Mq=+$bvPdFow%WL{4IRg5qfeNm zeCVrUbPZdbg08`mVN%~LcJ)8%8Ddpc;xtD@nz1CcjSks{PL09FuC7u(%D3amYX>#` z-GVXvUWvZHQS|)LVjVdy5{`+n>@nPnycmICP-5#olGq2E#4afjtK@|85gmnI2klC{ zb}e`ntH&44y3}3~YwKQY-yjkvh*eP``mG}s*`|(T$_BQ|hqKXo2|BnYhsFXhe-2b7 zu!#Gl_s4S($IWbxii!0!{fS~mEHS-aY5J^K>K|RA$ToFqj5f4|4}H_qohPM=3AR|8 zgsxT*)^e9yL($+po=Z)csZ}3*qVDA2KxBR>9F-lr_Q{@uCAht?lWEWv@k-SezY1!3 zCEq(OU*^o7flJ6Eu=(WvI*<=o|gb{)&R6#Mo|J`e#bZGsmo45NPi3qv9y5 ztQ`$e1WrUD{8IL?1i_7Oa~J*$K9ifBb>hI0V}+KjVUx(o;e#sg7&`d=SeFIFfkK8s z_?=$oK!NRxvyt4X*F@sKl@7og;2wxQ;3<5L$IP5OHgeqpdJ`z%ZixM0?-by_^AT=w zKDS4JJh1pa*~Yj)>X~(G9{&V0!)2hF;6vv=kgwv?C?Kyl3Rnffe_mQ)nh}{hahN={ za2_5eT34I*TRg{RvB7)bW>DkGtHAd)66I&wF30Wwr7dw+%K>m1sBp70K>v9lmq0xZ xaJG#=lIQHFMJslM!(p9|k+#4u$5k4K$bS}3k$(EIBYyw@002ovPDHLkV1gVaD+2%k literal 0 HcmV?d00001 diff --git a/TeamsApp/env/.env.dev b/TeamsApp/env/.env.dev new file mode 100644 index 0000000..df4f9da --- /dev/null +++ b/TeamsApp/env/.env.dev @@ -0,0 +1,15 @@ +# This file includes environment variables that will be committed to git by default. + +# Built-in environment variables +TEAMSFX_ENV=dev +APP_NAME_SUFFIX=dev + +# Updating AZURE_SUBSCRIPTION_ID or AZURE_RESOURCE_GROUP_NAME after provision may also require an update to RESOURCE_SUFFIX, because some services require a globally unique name across subscriptions/resource groups. +AZURE_SUBSCRIPTION_ID= +AZURE_RESOURCE_GROUP_NAME= +RESOURCE_SUFFIX= + +# Generated during provision, you can also add your own variables. +BOT_ID= +TEAMS_APP_ID= +BOT_AZURE_APP_SERVICE_RESOURCE_ID= \ No newline at end of file diff --git a/TeamsApp/env/.env.local b/TeamsApp/env/.env.local new file mode 100644 index 0000000..8584d42 --- /dev/null +++ b/TeamsApp/env/.env.local @@ -0,0 +1,16 @@ +# This file includes environment variables that can be committed to git. It's gitignored by default because it represents your local development environment. + +# Built-in environment variables +TEAMSFX_ENV=local +APP_NAME_SUFFIX=local + +# Generated during provision, you can also add your own variables. +BOT_ID=8f4248fc-ee30-4f54-8793-66edcca3fd20 +TEAMS_APP_ID=ea0047b8-d686-4e93-b987-d2c039d7d0ef +TEAMS_APP_TENANT_ID=20190830-5fd4-4a72-b8fd-1c1cb35b25bc +BOT_OBJECT_ID=76009812-3d88-43a2-97c6-3920e1ad2223 +BOT_ENDPOINT=https://vrzg2z27-5130.brs.devtunnels.ms +BOT_DOMAIN=vrzg2z27-5130.brs.devtunnels.ms + + +TEAMSFX_M365_USER_NAME=ricardo.carneiro@domvsit.com.br \ No newline at end of file diff --git a/TeamsApp/infra/azure.bicep b/TeamsApp/infra/azure.bicep new file mode 100644 index 0000000..96ed8d8 --- /dev/null +++ b/TeamsApp/infra/azure.bicep @@ -0,0 +1,73 @@ +@maxLength(20) +@minLength(4) +@description('Used to generate names for all resources in this file') +param resourceBaseName string + +@description('Required when create Azure Bot service') +param botAadAppClientId string + +@secure() +@description('Required by Bot Framework package in your bot project') +param botAadAppClientSecret string + +param webAppSKU string + +@maxLength(42) +param botDisplayName string + +param serverfarmsName string = resourceBaseName +param webAppName string = resourceBaseName +param location string = resourceGroup().location + +// Compute resources for your Web App +resource serverfarm 'Microsoft.Web/serverfarms@2021-02-01' = { + kind: 'app' + location: location + name: serverfarmsName + sku: { + name: webAppSKU + } +} + +// Web App that hosts your bot +resource webApp 'Microsoft.Web/sites@2021-02-01' = { + kind: 'app' + location: location + name: webAppName + properties: { + serverFarmId: serverfarm.id + httpsOnly: true + siteConfig: { + appSettings: [ + { + name: 'WEBSITE_RUN_FROM_PACKAGE' + value: '1' + } + { + name: 'BOT_ID' + value: botAadAppClientId + } + { + name: 'BOT_PASSWORD' + value: botAadAppClientSecret + } + ] + ftpsState: 'FtpsOnly' + } + } +} + +// Register your web service as a bot with the Bot Framework +module azureBotRegistration './botRegistration/azurebot.bicep' = { + name: 'Azure-Bot-registration' + params: { + resourceBaseName: resourceBaseName + botAadAppClientId: botAadAppClientId + botAppDomain: webApp.properties.defaultHostName + botDisplayName: botDisplayName + } +} + +// The output will be persisted in .env.{envName}. Visit https://aka.ms/teamsfx-actions/arm-deploy for more details. +output BOT_AZURE_APP_SERVICE_RESOURCE_ID string = webApp.id +output BOT_DOMAIN string = webApp.properties.defaultHostName diff --git a/TeamsApp/infra/azure.parameters.json b/TeamsApp/infra/azure.parameters.json new file mode 100644 index 0000000..5e680fe --- /dev/null +++ b/TeamsApp/infra/azure.parameters.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "resourceBaseName": { + "value": "bot${{RESOURCE_SUFFIX}}" + }, + "botAadAppClientId": { + "value": "${{BOT_ID}}" + }, + "botAadAppClientSecret": { + "value": "${{SECRET_BOT_PASSWORD}}" + }, + "webAppSKU": { + "value": "B1" + }, + "botDisplayName": { + "value": "IAChat" + } + } + } \ No newline at end of file diff --git a/TeamsApp/infra/botRegistration/azurebot.bicep b/TeamsApp/infra/botRegistration/azurebot.bicep new file mode 100644 index 0000000..ab67c7a --- /dev/null +++ b/TeamsApp/infra/botRegistration/azurebot.bicep @@ -0,0 +1,37 @@ +@maxLength(20) +@minLength(4) +@description('Used to generate names for all resources in this file') +param resourceBaseName string + +@maxLength(42) +param botDisplayName string + +param botServiceName string = resourceBaseName +param botServiceSku string = 'F0' +param botAadAppClientId string +param botAppDomain string + +// Register your web service as a bot with the Bot Framework +resource botService 'Microsoft.BotService/botServices@2021-03-01' = { + kind: 'azurebot' + location: 'global' + name: botServiceName + properties: { + displayName: botDisplayName + endpoint: 'https://${botAppDomain}/api/messages' + msaAppId: botAadAppClientId + } + sku: { + name: botServiceSku + } +} + +// Connect the bot service to Microsoft Teams +resource botServiceMsTeamsChannel 'Microsoft.BotService/botServices/channels@2021-03-01' = { + parent: botService + location: 'global' + name: 'MsTeamsChannel' + properties: { + channelName: 'MsTeamsChannel' + } +} diff --git a/TeamsApp/infra/botRegistration/readme.md b/TeamsApp/infra/botRegistration/readme.md new file mode 100644 index 0000000..d541624 --- /dev/null +++ b/TeamsApp/infra/botRegistration/readme.md @@ -0,0 +1 @@ +The `azurebot.bicep` module is provided to help you create Azure Bot service when you don't use Azure to host your app. If you use Azure as infrastrcture for your app, `azure.bicep` under infra folder already leverages this module to create Azure Bot service for you. You don't need to deploy `azurebot.bicep` again. \ No newline at end of file diff --git a/TeamsApp/launchSettings.json b/TeamsApp/launchSettings.json new file mode 100644 index 0000000..600bcab --- /dev/null +++ b/TeamsApp/launchSettings.json @@ -0,0 +1,15 @@ +{ + "profiles": { + // Launch project within Teams + "Microsoft Teams (browser)": { + "commandName": "Project", + "launchUrl": "https://teams.microsoft.com/l/app/${{TEAMS_APP_ID}}?installAppPackage=true&webjoin=true&appTenantId=${{TEAMS_APP_TENANT_ID}}&login_hint=${{TEAMSFX_M365_USER_NAME}}", + }, + // Launch project within Teams App Test Tool + "Teams App Test Tool (browser)": { + "commandName": "Project", + "launchTestTool": true, + "launchUrl": "http://localhost:56150", + }, + } +} \ No newline at end of file diff --git a/TeamsApp/teamsapp.local.yml b/TeamsApp/teamsapp.local.yml new file mode 100644 index 0000000..c2b30d6 --- /dev/null +++ b/TeamsApp/teamsapp.local.yml @@ -0,0 +1,74 @@ +# yaml-language-server: $schema=https://aka.ms/teams-toolkit/v1.5/yaml.schema.json +# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file +# Visit https://aka.ms/teamsfx-actions for details on actions +version: v1.5 + +provision: + # Creates a Teams app + - uses: teamsApp/create + with: + # Teams app name + name: IAChat${{APP_NAME_SUFFIX}} + # Write the information of created resources into environment file for + # the specified environment variable(s). + writeToEnvironmentFile: + teamsAppId: TEAMS_APP_ID + + # Create or reuse an existing Microsoft Entra application for bot. + - uses: aadApp/create + with: + # The Microsoft Entra application's display name + name: IAChat${{APP_NAME_SUFFIX}} + generateClientSecret: true + signInAudience: AzureADMultipleOrgs + writeToEnvironmentFile: + # The Microsoft Entra application's client id created for bot. + clientId: BOT_ID + # The Microsoft Entra application's client secret created for bot. + clientSecret: SECRET_BOT_PASSWORD + # The Microsoft Entra application's object id created for bot. + objectId: BOT_OBJECT_ID + + # Generate runtime appsettings to JSON file + - uses: file/createOrUpdateJsonFile + with: + target: ../appsettings.Development.json + content: + BOT_ID: ${{BOT_ID}} + BOT_PASSWORD: ${{SECRET_BOT_PASSWORD}} + + # Create or update the bot registration on dev.botframework.com + - uses: botFramework/create + with: + botId: ${{BOT_ID}} + name: IAChat + messagingEndpoint: ${{BOT_ENDPOINT}}/api/messages + description: "" + channels: + - name: msteams + + # Validate using manifest schema + - uses: teamsApp/validateManifest + with: + # Path to manifest template + manifestPath: ./appPackage/manifest.json + # Build Teams app package with latest env value + - uses: teamsApp/zipAppPackage + with: + # Path to manifest template + manifestPath: ./appPackage/manifest.json + outputZipPath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + outputJsonPath: ./appPackage/build/manifest.${{TEAMSFX_ENV}}.json + # Validate app package using validation rules + - uses: teamsApp/validateAppPackage + with: + # Relative path to this file. This is the path for built zip file. + appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + + # Apply the Teams app manifest to an existing Teams app in + # Teams Developer Portal. + # Will use the app id in manifest file to determine which Teams app to update. + - uses: teamsApp/update + with: + # Relative path to this file. This is the path for built zip file. + appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip diff --git a/TeamsApp/teamsapp.yml b/TeamsApp/teamsapp.yml new file mode 100644 index 0000000..66a87d4 --- /dev/null +++ b/TeamsApp/teamsapp.yml @@ -0,0 +1,103 @@ +# yaml-language-server: $schema=https://aka.ms/teams-toolkit/v1.5/yaml.schema.json +# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file +# Visit https://aka.ms/teamsfx-actions for details on actions +version: v1.5 + +environmentFolderPath: ./env + +# Triggered when 'teamsapp provision' is executed +provision: + # Creates a Teams app + - uses: teamsApp/create + with: + # Teams app name + name: IAChat${{APP_NAME_SUFFIX}} + # Write the information of created resources into environment file for + # the specified environment variable(s). + writeToEnvironmentFile: + teamsAppId: TEAMS_APP_ID + + # Create or reuse an existing Microsoft Entra application for bot. + - uses: aadApp/create + with: + # The Microsoft Entra application's display name + name: IAChat${{APP_NAME_SUFFIX}} + generateClientSecret: true + signInAudience: AzureADMultipleOrgs + writeToEnvironmentFile: + # The Microsoft Entra application's client id created for bot. + clientId: BOT_ID + # The Microsoft Entra application's client secret created for bot. + clientSecret: SECRET_BOT_PASSWORD + # The Microsoft Entra application's object id created for bot. + objectId: BOT_OBJECT_ID + + - uses: arm/deploy # Deploy given ARM templates parallelly. + with: + # AZURE_SUBSCRIPTION_ID is a built-in environment variable, + # if its value is empty, TeamsFx will prompt you to select a subscription. + # Referencing other environment variables with empty values + # will skip the subscription selection prompt. + subscriptionId: ${{AZURE_SUBSCRIPTION_ID}} + # AZURE_RESOURCE_GROUP_NAME is a built-in environment variable, + # if its value is empty, TeamsFx will prompt you to select or create one + # resource group. + # Referencing other environment variables with empty values + # will skip the resource group selection prompt. + resourceGroupName: ${{AZURE_RESOURCE_GROUP_NAME}} + templates: + - path: ./infra/azure.bicep # Relative path to this file + # Relative path to this yaml file. + # Placeholders will be replaced with corresponding environment + # variable before ARM deployment. + parameters: ./infra/azure.parameters.json + # Required when deploying ARM template + deploymentName: Create-resources-for-bot + # Teams Toolkit will download this bicep CLI version from github for you, + # will use bicep CLI in PATH if you remove this config. + bicepCliVersion: v0.9.1 + + # Validate using manifest schema + - uses: teamsApp/validateManifest + with: + # Path to manifest template + manifestPath: ./appPackage/manifest.json + # Build Teams app package with latest env value + - uses: teamsApp/zipAppPackage + with: + # Path to manifest template + manifestPath: ./appPackage/manifest.json + outputZipPath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + outputJsonPath: ./appPackage/build/manifest.${{TEAMSFX_ENV}}.json + # Validate app package using validation rules + - uses: teamsApp/validateAppPackage + with: + # Relative path to this file. This is the path for built zip file. + appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + # Apply the Teams app manifest to an existing Teams app in + # Teams Developer Portal. + # Will use the app id in manifest file to determine which Teams app to update. + - uses: teamsApp/update + with: + # Relative path to this file. This is the path for built zip file. + appPackagePath: ./appPackage/build/appPackage.${{TEAMSFX_ENV}}.zip + +# Triggered when 'teamsapp deploy' is executed +deploy: + - uses: cli/runDotnetCommand + with: + args: publish --configuration Release IAChat.csproj + workingDirectory: .. + # Deploy your application to Azure App Service using the zip deploy feature. + # For additional details, refer to https://aka.ms/zip-deploy-to-app-services. + - uses: azureAppService/zipDeploy + with: + # Deploy base folder + artifactFolder: bin/Release/net8.0/publish + # The resource id of the cloud resource to be deployed to. + # This key will be generated by arm/deploy action automatically. + # You can replace it with your existing Azure Resource id + # or add it to your environment variable file. + resourceId: ${{BOT_AZURE_APP_SERVICE_RESOURCE_ID}} + workingDirectory: .. +projectId: a0e11721-e5ae-4dbd-8047-057a772737e7 diff --git a/appsettings.TestTool.json b/appsettings.TestTool.json new file mode 100644 index 0000000..1a3d21d --- /dev/null +++ b/appsettings.TestTool.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*", + "BOT_ID": "", + "BOT_PASSWORD": "" +} \ No newline at end of file diff --git a/appsettings.json b/appsettings.json new file mode 100644 index 0000000..da0e54e --- /dev/null +++ b/appsettings.json @@ -0,0 +1,16 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*", + "BOT_ID": "$botId$", + "BOT_PASSWORD": "$bot-password$", + "AppClientID": "8f4248fc-ee30-4f54-8793-66edcca3fd20", + "AppClientSecret": "4ea5e989-37dc-4ace-96a6-0fa0f74ef059", + "AppClientSecretValue": "AMI8Q~YCMY4ffjypwWMxOQlDI9I3TCkk3Lhfga8e", + "AppTenantId": "20190830-5fd4-4a72-b8fd-1c1cb35b25bc" +}