From 6764acc55f8b641d964b1f76717e464beb51159f Mon Sep 17 00:00:00 2001
From: adam <git@adamrgrey.com>
Date: Thu, 22 May 2025 11:46:03 -0400
Subject: [PATCH] kafka messages include UAC match

---
 Behaver.cs                                    | 19 +++++++++++--------
 ConsoleService.cs                             |  2 +-
 Models/Message.cs                             |  1 -
 .../DiscordInterface/DiscordInterface.cs      |  1 +
 .../TwitchInterface/TwitchInterface.cs        |  1 +
 Rememberer.cs                                 | 11 +++++++++++
 appsettings.json                              |  3 ++-
 7 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/Behaver.cs b/Behaver.cs
index 7fa9a17f..33665a00 100644
--- a/Behaver.cs
+++ b/Behaver.cs
@@ -43,16 +43,19 @@ public class Behaver
 
     public async Task<bool> ActOn(Message message)
     {
+        var matchingUACs = Rememberer.MatchUACs(message);
         var behaviorsActedOn = new List<string>();
         foreach (var behavior in Behaviors)
         {
-            if (behavior.ShouldAct(message))
+            //if (!behavior.ShouldAct(message, matchingUACs)) //TODO: this way
+            if(!behavior.ShouldAct(message))
             {
-                behavior.ActOn(message);
-                message.ActedOn = true;
-                behaviorsActedOn.Add(behavior.ToString());
-                Console.WriteLine("acted on, moving forward");
+                continue;
             }
+            behavior.ActOn(message);
+            message.ActedOn = true;
+            behaviorsActedOn.Add(behavior.ToString());
+            Console.WriteLine("acted on, moving forward");
         }
         if (message.ActedOn == false && message.MentionsMe && message.Content.Contains('?') && !Behaver.Instance.SelfAccounts.Any(acc => acc.Id == message.Author.Id))
         {
@@ -66,11 +69,11 @@ public class Behaver
             behaviorsActedOn.Add("generic question fallback");
         }
         Rememberer.RememberMessage(message);
-        ForwardToKafka(message, behaviorsActedOn);
+        ForwardToKafka(message, behaviorsActedOn, matchingUACs);
         return message.ActedOn;
     }
 
-    internal void ForwardToKafka(Message message, List<string> actedOnBy)
+    internal void ForwardToKafka(Message message, List<string> actedOnBy, List<UAC> matchingUACs)
     {
         var kafkaesque = new chat_message()
         {
@@ -92,7 +95,7 @@ public class Behaver
             ChannelName = message.Channel.DisplayName,
             ChannelProtoocl = message.Channel.Protocol,
 
-            UAC_Matches = null,
+            UAC_Matches = matchingUACs.Select(uac => uac.Id).ToList(),
             BehavedOnBy = actedOnBy
         };
         Telefranz.Instance.ProduceMessage(kafkaesque);
diff --git a/ConsoleService.cs b/ConsoleService.cs
index be73c9ea..f962c8f3 100644
--- a/ConsoleService.cs
+++ b/ConsoleService.cs
@@ -14,10 +14,10 @@ namespace vassago
         {
             Shared.DBConnectionString = aspConfig["DBConnectionString"];
             Shared.SetupSlashCommands = aspConfig["SetupSlashCommands"]?.ToLower() == "true";
+            Shared.API_URL = new Uri(aspConfig["API_URL"]);
             DiscordTokens = aspConfig.GetSection("DiscordTokens").Get<IEnumerable<string>>();
             TwitchConfigs = aspConfig.GetSection("TwitchConfigs").Get<IEnumerable<TwitchConfig>>();
             Conversion.Converter.Load(aspConfig["ExchangePairsLocation"]);
-
             Telefranz.Configure(aspConfig["KafkaName"], aspConfig["KafkaBootstrap"]);
             vassago.Behavior.Webhook.SetupWebhooks(aspConfig.GetSection("Webhooks"));
         }
diff --git a/Models/Message.cs b/Models/Message.cs
index 367ab613..3c909c73 100644
--- a/Models/Message.cs
+++ b/Models/Message.cs
@@ -23,7 +23,6 @@ public class Message
     public Account Author { get; set; }
     public Channel Channel { get; set; }
 
-
 //TODO: these are nicities to make it OOP, but it couples them with their respective platform interfaces (and connections!)
     [NonSerialized]
     public Func<string, Task> Reply;
diff --git a/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs b/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs
index 455eccf5..607f9eba 100644
--- a/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs
+++ b/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs
@@ -209,6 +209,7 @@ public class DiscordInterface
         var m = Rememberer.SearchMessage(mi => mi.ExternalId == dMessage.Id.ToString() && mi.Protocol == PROTOCOL)
             ?? new()
             {
+                //I don't understand why messages need to have their Ids specified but no other entity does. shrug dot emoji
                 Id = Guid.NewGuid(),
                 Protocol = PROTOCOL
             };
diff --git a/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs b/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs
index a83246ac..a356e0d3 100644
--- a/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs
+++ b/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs
@@ -291,6 +291,7 @@ public class TwitchInterface
         var m = Rememberer.SearchMessage(mi => mi.ExternalId == whisperMessage.MessageId && mi.Protocol == PROTOCOL)
             ?? new()
             {
+                Id = Guid.NewGuid(),
                 Protocol = PROTOCOL,
                 Timestamp = (DateTimeOffset)DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc)
             };
diff --git a/Rememberer.cs b/Rememberer.cs
index b3da02d8..4634b7e0 100644
--- a/Rememberer.cs
+++ b/Rememberer.cs
@@ -179,6 +179,17 @@ public static class Rememberer
         dbAccessSemaphore.Release();
         return toReturn;
     }
+    public static List<UAC> MatchUACs(Message message)
+    {
+        var msgId = message.Id;
+        var accId = message.Author.Id;
+        var usrId = message.Author.IsUser.Id;
+        var chId = message.Channel.Id;
+
+        return SearchUACs(uac => uac.AccountInChannels.FirstOrDefault(aic => aic.Id == accId) != null
+                          || uac.Users.FirstOrDefault(usr => usr.Id == usrId) != null
+                          || uac.Channels.FirstOrDefault(ch => ch.Id == chId) != null);
+    }
     public static List<UAC> SearchUACs(Expression<Func<UAC, bool>> predicate)
     {
         List<UAC> toReturn;
diff --git a/appsettings.json b/appsettings.json
index 5362219c..35fb96e3 100644
--- a/appsettings.json
+++ b/appsettings.json
@@ -23,5 +23,6 @@
     }
   ],
   "KafkaBootstrap":"http://localhost:9092",
-  "KafkaName":"vassago"
+  "KafkaName":"vassago",
+  "API_URL": "http://localhost:5093/api"
 }