From 2342116e87af94406cfc2d745a55739f174b7676 Mon Sep 17 00:00:00 2001
From: Macintxsh <95250141+mctaylors@users.noreply.github.com>
Date: Tue, 19 Mar 2024 20:51:32 +0300
Subject: [PATCH] Add GitInfo NuGet package (#268)

In this PR, I added a NuGet package called GitInfo. It can replace
Octobot.RepositoryUrl and display the bot version as the current branch
and commit.

---------

Signed-off-by: mctaylors <cantsendmails@mctaylors.ru>
Signed-off-by: Macintxsh <95250141+mctaylors@users.noreply.github.com>
---
 Octobot.csproj                                |  2 +
 locale/Messages.resx                          |  3 ++
 locale/Messages.ru.resx                       |  3 ++
 locale/Messages.tt-ru.resx                    |  3 ++
 src/BuildInfo.cs                              | 52 +++++++++++++++++++
 src/Commands/AboutCommandGroup.cs             |  5 +-
 .../Events/ErrorLoggingPostExecutionEvent.cs  |  2 +-
 src/Messages.Designer.cs                      |  9 +++-
 src/Octobot.cs                                |  3 --
 src/Responders/GuildLoadedResponder.cs        |  2 +-
 10 files changed, 75 insertions(+), 9 deletions(-)
 create mode 100644 src/BuildInfo.cs

diff --git a/Octobot.csproj b/Octobot.csproj
index ab76400..bdfb46a 100644
--- a/Octobot.csproj
+++ b/Octobot.csproj
@@ -17,10 +17,12 @@
         <NeutralLanguage>en</NeutralLanguage>
         <Description>A general-purpose Discord bot for moderation written in C#</Description>
         <ApplicationIcon>docs/octobot.ico</ApplicationIcon>
+        <GitVersion>false</GitVersion>
     </PropertyGroup>
 
     <ItemGroup>
         <PackageReference Include="DiffPlex" Version="1.7.2" />
+        <PackageReference Include="GitInfo" Version="3.3.4" />
         <PackageReference Include="Humanizer.Core.ru" Version="2.14.1" />
         <PackageReference Include="JetBrains.Annotations" Version="2023.3.0" />
         <PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4" />
diff --git a/locale/Messages.resx b/locale/Messages.resx
index c2b9abb..c2be4cd 100644
--- a/locale/Messages.resx
+++ b/locale/Messages.resx
@@ -657,6 +657,9 @@
   <data name="TimeSpanExample" xml:space="preserve">
       <value>Example of a valid input: `1h30m`</value>
   </data>
+  <data name="Version" xml:space="preserve">
+      <value>Version: {0}</value>
+  </data>
   <data name="SettingsWelcomeMessagesChannel" xml:space="preserve">
       <value>Welcome messages channel</value>
   </data>
diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx
index 814106a..d38509c 100644
--- a/locale/Messages.ru.resx
+++ b/locale/Messages.ru.resx
@@ -657,6 +657,9 @@
   <data name="TimeSpanExample" xml:space="preserve">
       <value>Пример правильного ввода: `1ч30м`</value>
   </data>
+  <data name="Version" xml:space="preserve">
+      <value>Версия: {0}</value>
+  </data>
   <data name="SettingsWelcomeMessagesChannel" xml:space="preserve">
       <value>Канал для приветствий</value>
   </data>
diff --git a/locale/Messages.tt-ru.resx b/locale/Messages.tt-ru.resx
index 71357ad..dfb1ee6 100644
--- a/locale/Messages.tt-ru.resx
+++ b/locale/Messages.tt-ru.resx
@@ -657,6 +657,9 @@
   <data name="TimeSpanExample" xml:space="preserve">
       <value>правильно пишут так: `1h30m`</value>
   </data>
+  <data name="Version" xml:space="preserve">
+      <value>{0}</value>
+  </data>
   <data name="SettingsWelcomeMessagesChannel" xml:space="preserve">
       <value>канал куда говорить здравствуйте</value>
   </data>
diff --git a/src/BuildInfo.cs b/src/BuildInfo.cs
new file mode 100644
index 0000000..50f86a2
--- /dev/null
+++ b/src/BuildInfo.cs
@@ -0,0 +1,52 @@
+namespace Octobot;
+
+public static class BuildInfo
+{
+    public static string RepositoryUrl
+    {
+        get
+        {
+            return ThisAssembly.Git.RepositoryUrl;
+        }
+    }
+
+    public static string IssuesUrl
+    {
+        get
+        {
+            return $"{RepositoryUrl}/issues";
+        }
+    }
+
+    private static string Commit
+    {
+        get
+        {
+            return ThisAssembly.Git.Commit;
+        }
+    }
+
+    private static string Branch
+    {
+        get
+        {
+            return ThisAssembly.Git.Branch;
+        }
+    }
+
+    private static bool IsDirty
+    {
+        get
+        {
+            return ThisAssembly.Git.IsDirty;
+        }
+    }
+
+    public static string Version
+    {
+        get
+        {
+            return IsDirty ? $"{Branch}-{Commit}-dirty" : $"{Branch}-{Commit}";
+        }
+    }
+}
diff --git a/src/Commands/AboutCommandGroup.cs b/src/Commands/AboutCommandGroup.cs
index e978ec9..05b1855 100644
--- a/src/Commands/AboutCommandGroup.cs
+++ b/src/Commands/AboutCommandGroup.cs
@@ -101,20 +101,21 @@ public class AboutCommandGroup : CommandGroup
             .WithDescription(builder.ToString())
             .WithColour(ColorsList.Cyan)
             .WithImageUrl("https://i.ibb.co/fS6wZhh/octobot-banner.png")
+            .WithFooter(string.Format(Messages.Version, BuildInfo.Version))
             .Build();
 
         var repositoryButton = new ButtonComponent(
             ButtonComponentStyle.Link,
             Messages.ButtonOpenRepository,
             new PartialEmoji(Name: "🌐"),
-            URL: Octobot.RepositoryUrl
+            URL: BuildInfo.RepositoryUrl
         );
 
         var issuesButton = new ButtonComponent(
             ButtonComponentStyle.Link,
             Messages.ButtonReportIssue,
             new PartialEmoji(Name: "⚠️"),
-            URL: Octobot.IssuesUrl
+            URL: BuildInfo.IssuesUrl
         );
 
         return await _feedback.SendContextualEmbedResultAsync(embed,
diff --git a/src/Commands/Events/ErrorLoggingPostExecutionEvent.cs b/src/Commands/Events/ErrorLoggingPostExecutionEvent.cs
index 87cfc84..5d7830b 100644
--- a/src/Commands/Events/ErrorLoggingPostExecutionEvent.cs
+++ b/src/Commands/Events/ErrorLoggingPostExecutionEvent.cs
@@ -72,7 +72,7 @@ public class ErrorLoggingPostExecutionEvent : IPostExecutionEvent
             ButtonComponentStyle.Link,
             Messages.ButtonReportIssue,
             new PartialEmoji(Name: "⚠️"),
-            URL: Octobot.IssuesUrl
+            URL: BuildInfo.IssuesUrl
         );
 
         return await _feedback.SendContextualEmbedResultAsync(embed,
diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs
index 4694254..707c814 100644
--- a/src/Messages.Designer.cs
+++ b/src/Messages.Designer.cs
@@ -1185,8 +1185,13 @@ namespace Octobot {
             }
         }
 
-        internal static string SettingsWelcomeMessagesChannel
-        {
+        internal static string Version {
+            get {
+                return ResourceManager.GetString("Version", resourceCulture);
+            }
+        }
+
+        internal static string SettingsWelcomeMessagesChannel {
             get {
                 return ResourceManager.GetString("SettingsWelcomeMessagesChannel", resourceCulture);
             }
diff --git a/src/Octobot.cs b/src/Octobot.cs
index 1ebf7c3..e0d9b07 100644
--- a/src/Octobot.cs
+++ b/src/Octobot.cs
@@ -22,9 +22,6 @@ namespace Octobot;
 
 public sealed class Octobot
 {
-    public const string RepositoryUrl = "https://github.com/TeamOctolings/Octobot";
-    public const string IssuesUrl = $"{RepositoryUrl}/issues";
-
     public static readonly AllowedMentions NoMentions = new(
         Array.Empty<MentionType>(), Array.Empty<Snowflake>(), Array.Empty<Snowflake>());
 
diff --git a/src/Responders/GuildLoadedResponder.cs b/src/Responders/GuildLoadedResponder.cs
index fd289fc..c493910 100644
--- a/src/Responders/GuildLoadedResponder.cs
+++ b/src/Responders/GuildLoadedResponder.cs
@@ -117,7 +117,7 @@ public class GuildLoadedResponder : IResponder<IGuildCreate>
             ButtonComponentStyle.Link,
             Messages.ButtonReportIssue,
             new PartialEmoji(Name: "⚠️"),
-            URL: Octobot.IssuesUrl
+            URL: BuildInfo.IssuesUrl
         );
 
         return await _channelApi.CreateMessageWithEmbedResultAsync(channel, embedResult: errorEmbed,