Skip to content

Commit a76c710

Browse files
Generate Microsoft Teams message
1 parent 88fe167 commit a76c710

File tree

13 files changed

+152
-447
lines changed

13 files changed

+152
-447
lines changed

AzureDevopsTracker/AzureDevopsTracker.csproj

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@
1818
<PackageLicenseFile>LICENSE.md.txt</PackageLicenseFile>
1919
<Description>A NuGet that allows you to use a Azure DevOps Service Hook to track workitems changes in a simply and detailed way.</Description>
2020
<AssemblyVersion>1.1.0.0</AssemblyVersion>
21-
<FileVersion>1.1.0.0</FileVersion>
22-
<Version>1.1.4-alpha</Version>
21+
<FileVersion>1.1.5-alpha</FileVersion>
22+
<Version>1.1.5-alpha</Version>
2323
<PackageReleaseNotes>Add ChangeLog Feature</PackageReleaseNotes>
2424
</PropertyGroup>
2525

2626
<ItemGroup>
2727
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.7" />
2828
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="1.1.2" />
29-
<PackageReference Include="Microsoft.Extensions.Localization" Version="6.0.1" />
3029
<PackageReference Include="System.Net.Http.Json" Version="6.0.0" />
3130
</ItemGroup>
3231

@@ -37,30 +36,6 @@
3736
</None>
3837
</ItemGroup>
3938

40-
<ItemGroup>
41-
<Compile Update="Resources\SharedResource.pt-BR.Designer.cs">
42-
<DependentUpon>SharedResource.pt-BR.resx</DependentUpon>
43-
<DesignTime>True</DesignTime>
44-
<AutoGen>True</AutoGen>
45-
</Compile>
46-
<Compile Update="Resources\SharedResource.Designer.cs">
47-
<DesignTime>True</DesignTime>
48-
<AutoGen>True</AutoGen>
49-
<DependentUpon>SharedResource.resx</DependentUpon>
50-
</Compile>
51-
</ItemGroup>
52-
53-
<ItemGroup>
54-
<EmbeddedResource Update="Resources\SharedResource.pt-BR.resx">
55-
<LastGenOutput>SharedResource.pt-BR.Designer.cs</LastGenOutput>
56-
<Generator>ResXFileCodeGenerator</Generator>
57-
</EmbeddedResource>
58-
<EmbeddedResource Update="Resources\SharedResource.resx">
59-
<Generator>ResXFileCodeGenerator</Generator>
60-
<LastGenOutput>SharedResource.Designer.cs</LastGenOutput>
61-
</EmbeddedResource>
62-
</ItemGroup>
63-
6439
<ItemGroup>
6540
<None Update="adt_icon.png">
6641
<Pack>True</Pack>

AzureDevopsTracker/Configurations/Configuration.cs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,23 @@ public static IServiceCollection AddAzureDevopsTracker(this IServiceCollection s
3131
services.AddScoped<IChangeLogItemRepository, ChangeLogItemRepository>();
3232
services.AddScoped<IChangeLogRepository, ChangeLogRepository>();
3333

34-
services.AddLocalization(options => options.ResourcesPath = "Resources");
35-
3634
return services;
3735
}
3836

3937
private static IServiceCollection AddMessageIntegrations(this IServiceCollection services)
4038
{
41-
if (MessageConfig.Messenger == null) return services;
42-
43-
if(MessageConfig.Messenger == EMessengers.DISCORD)
44-
services.AddScoped<MessageIntegration, DiscordIntegration>();
45-
else
46-
services.AddScoped<MessageIntegration, MicrosoftTeamsIntegration>();
47-
39+
switch (MessageConfig.Messenger)
40+
{
41+
case EMessengers.DISCORD:
42+
services.AddScoped<MessageIntegration, DiscordIntegration>();
43+
break;
44+
case EMessengers.MICROSOFT_TEAMS:
45+
services.AddScoped<MessageIntegration, MicrosoftTeamsIntegration>();
46+
break;
47+
default:
48+
services.AddScoped<MessageIntegration, FakeIntegration>();
49+
break;
50+
}
4851
return services;
4952
}
5053

AzureDevopsTracker/Entities/ChangeLog.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ public ChangeLog(int newRevision)
2020
Number = $"{ CreatedAt:yyyyMMdd}.{ Revision }";
2121
}
2222

23+
public ChangeLog(string number)
24+
{
25+
Number = number;
26+
}
27+
2328
public void SetResponse(string response)
2429
{
2530
Response = response;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using AzureDevopsTracker.Entities;
2+
3+
namespace AzureDevopsTracker.Integrations
4+
{
5+
internal class FakeIntegration : MessageIntegration
6+
{
7+
internal override void Send(ChangeLog changeLog)
8+
{
9+
10+
}
11+
}
12+
}

AzureDevopsTracker/Integrations/MessageIntegration.cs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,54 @@
22
using System;
33
using System.Net.Http;
44
using System.Text;
5-
using System.Text.Json;
65

76
namespace AzureDevopsTracker.Integrations
87
{
98
public abstract class MessageIntegration
109
{
11-
public abstract void Send(ChangeLog changeLog);
10+
internal abstract void Send(ChangeLog changeLog);
1211
private static readonly string MIMETYPE = "application/json";
12+
private static readonly string CDN_URL = "https://cdn.typinghard.tech/";
13+
private static readonly string MEGAFONE_GIF = "megafone.gif";
14+
private static readonly string LOGO_TYPINGHARD_16X16 = "logo-typinghard-16x16.png";
1315

14-
protected string GetTitle(ChangeLog changeLog)
16+
protected internal string GetTitle(ChangeLog changeLog)
1517
{
1618
return $"Nova atualização da plataforma";
1719
}
1820

19-
protected string GetVersion(ChangeLog changeLog)
21+
protected internal string GetVersion(ChangeLog changeLog)
2022
{
2123
return $"Versao: { changeLog.Number}";
2224
}
2325

24-
protected string GetNugetVersion()
26+
protected internal string GetAnnouncementImageUrl()
27+
{
28+
return $"{CDN_URL}{MEGAFONE_GIF}";
29+
}
30+
31+
protected internal string GetLogoTypingHard16x16Url()
32+
{
33+
return $"{CDN_URL}{LOGO_TYPINGHARD_16X16}";
34+
}
35+
36+
protected internal string GetNugetVersion()
2537
{
2638
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
2739
System.Diagnostics.FileVersionInfo fileVersionInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
28-
return $"Powered by Typing Hard { fileVersionInfo.FileVersion }";
40+
return $"Powered by **Typing Hard** • nuget version { fileVersionInfo.FileVersion }";
2941
}
3042

31-
protected HttpResponseMessage Notify(object body)
43+
protected internal HttpResponseMessage Notify(object body)
3244
{
33-
var json = JsonSerializer.Serialize(body);
45+
var json = Newtonsoft.Json.JsonConvert.SerializeObject(body);
3446
var content = new StringContent(json,
3547
Encoding.UTF8,
3648
MIMETYPE);
3749
HttpClient client = new HttpClient();
3850
return client.PostAsync(new Uri(MessageConfig.URL),
3951
content).Result;
52+
4053
}
4154
}
4255
}
Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
using AzureDevopsTracker.Entities;
2-
using System;
2+
using AzureDevopsTracker.Statics;
33
using System.Collections.Generic;
4-
using System.Net.Http;
5-
using System.Net.Http.Json;
4+
using System.Linq;
65
using System.Text;
76

87
namespace AzureDevopsTracker.Integrations
98
{
109
internal class MicrosoftTeamsIntegration : MessageIntegration
1110
{
12-
public class MicrosoftTeamsMessage
11+
internal class MicrosoftTeamsMessage
1312
{
1413
public string type { get; set; }
1514
public string context { get; set; }
@@ -19,7 +18,7 @@ public class MicrosoftTeamsMessage
1918
public Section[] sections { get; set; }
2019
}
2120

22-
public class Section
21+
internal class Section
2322
{
2423
public string activityTitle { get; set; }
2524
public string activitySubtitle { get; set; }
@@ -40,29 +39,71 @@ internal override void Send(ChangeLog changeLog)
4039
{
4140
//Formatar o texto com o MicrosoftTeamsHelper
4241

43-
//Faz o Post com a URL
44-
var url = MessageConfig.URL;
4542
var values = new MicrosoftTeamsMessage()
4643
{
4744
type = MicrosoftTeamsStrings.Type,
4845
context = MicrosoftTeamsStrings.Context,
4946
themeColor = MicrosoftTeamsStrings.ThemeColor,
50-
//summary = MicrosoftTeamsStrings.
47+
summary = GetTitle(changeLog),
48+
sections = new Section[1]
49+
{
50+
new Section()
51+
{
52+
activityTitle = GetTitle(changeLog),
53+
activitySubtitle = $"Versão: { changeLog.Number }",
54+
activityImage = GetAnnouncementImageUrl(),
55+
text = GetText(changeLog),
56+
markdown = true
57+
}
58+
}
59+
};
5160

61+
var response = Notify(values);
5262

53-
};
63+
//Seta o retorno no ChangeLog
5464

55-
var json = JsonContent.Create(values);
65+
//Retorna o ChangeLog
66+
}
5667

57-
HttpClient client = new HttpClient();
58-
var response = client.PostAsync(MessageConfig.URL, json).Result;
68+
private string GetText(ChangeLog changeLog)
69+
{
70+
if (changeLog == null || !changeLog.ChangeLogItems.Any()) return string.Empty;
5971

60-
//var responseString = await response.Content.ReadAsStringAsync();
72+
StringBuilder text = new StringBuilder();
73+
text.Append(GetWorkItemsDescriptionSection("Features", changeLog.ChangeLogItems.Where(x => x.WorkItemType != WorkItemStatics.WORKITEM_TYPE_BUG)));
74+
text.Append(GetWorkItemsDescriptionSection("Correções", changeLog.ChangeLogItems.Where(x => x.WorkItemType == WorkItemStatics.WORKITEM_TYPE_BUG)));
6175

76+
text.Append(GetFooter());
77+
return text.ToString();
78+
}
6279

63-
//Seta o retorno no ChangeLog
80+
private string GetWorkItemsDescriptionSection(string sectionName, IEnumerable<ChangeLogItem> changeLogItems)
81+
{
82+
StringBuilder text = new StringBuilder();
83+
if (!changeLogItems.Any()) return string.Empty;
6484

65-
//Retorna o ChangeLog
85+
text.Append("<br>");
86+
text.AppendLine("\n");
87+
88+
text.Append($"\n # **{ sectionName }**\n");
89+
foreach (var workItem in changeLogItems)
90+
{
91+
text.Append(GetWorkItemDescriptionLine(workItem));
92+
}
93+
94+
text.Append("<br>");
95+
text.AppendLine("\n");
96+
return text.ToString();
97+
}
98+
99+
private string GetWorkItemDescriptionLine(ChangeLogItem workItem)
100+
{
101+
return $"<br><em>{ workItem.WorkItemId }</em> - { workItem.Description }";
102+
}
103+
104+
private string GetFooter()
105+
{
106+
return $"<br><sup> <img src='{ GetLogoTypingHard16x16Url() }' />{ GetNugetVersion() }</sup>";
66107
}
67108
}
68109
}

AzureDevopsTracker/Resources/SharedResource.Designer.cs

Lines changed: 0 additions & 72 deletions
This file was deleted.

0 commit comments

Comments
 (0)