From d060e92ed98efe259fd60cbb05c3380f048bea75 Mon Sep 17 00:00:00 2001 From: Adam R Grey Date: Fri, 1 Dec 2023 14:02:47 -0500 Subject: [PATCH] link to self but twitch interface can't whisper self atm --- Behavior/DefinitionSnarkGaslight.cs | 2 +- Behavior/Joke.cs | 27 ++++ Behavior/LaughAtOwnJoke.cs | 39 ------ Behavior/LinkMe.cs | 115 ++++++++++++++++++ .../DiscordInterface/DiscordInterface.cs | 13 +- .../TwitchInterface/TwitchInterface.cs | 48 +++++--- 6 files changed, 180 insertions(+), 64 deletions(-) delete mode 100644 Behavior/LaughAtOwnJoke.cs create mode 100644 Behavior/LinkMe.cs diff --git a/Behavior/DefinitionSnarkGaslight.cs b/Behavior/DefinitionSnarkGaslight.cs index ecb31c4..c6abb90 100644 --- a/Behavior/DefinitionSnarkGaslight.cs +++ b/Behavior/DefinitionSnarkGaslight.cs @@ -28,7 +28,7 @@ public class DefinitionSnarkGaslight : Behavior public override async Task ActOn(Message message) { - await message.Channel.SendMessage("that's not what gaslight means. Did you mean \"say something that (you believe) is wrong\"?"); + await message.Channel.SendMessage("that's not what gaslight means. Did you mean \"deceive\"?"); return true; } } \ No newline at end of file diff --git a/Behavior/Joke.cs b/Behavior/Joke.cs index f7eb1b5..a520220 100644 --- a/Behavior/Joke.cs +++ b/Behavior/Joke.cs @@ -53,4 +53,31 @@ public class Joke : Behavior } return true; } +} +public class LaughAtOwnJoke : Behavior +{ + public override string Name => "Laugh at own jokes"; + + public override string Trigger => "1 in 8"; + + public override string Description => Name; + private string _punchline{get;set;} + + public LaughAtOwnJoke(string punchline) + { + _punchline = punchline; + } + public override bool ShouldAct(Message message) + { + Console.WriteLine($"{message.Content} == {_punchline}"); + return message.Content == _punchline + && Behaver.Instance.Selves.Any(acc => acc.Id == message.Author.Id); + } + + public override async Task ActOn(Message message) + { + await message.React("\U0001F60E"); //smiling face with sunglasses + Behaver.Behaviors.Remove(this); + return true; + } } \ No newline at end of file diff --git a/Behavior/LaughAtOwnJoke.cs b/Behavior/LaughAtOwnJoke.cs deleted file mode 100644 index 49c8d41..0000000 --- a/Behavior/LaughAtOwnJoke.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace vassago.Behavior; - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using vassago.Models; - - -public class LaughAtOwnJoke : Behavior -{ - public override string Name => "Laugh at own jokes"; - - public override string Trigger => "1 in 8"; - - public override string Description => Name; - private string _punchline{get;set;} - - public LaughAtOwnJoke(string punchline) - { - _punchline = punchline; - } - public override bool ShouldAct(Message message) - { - Console.WriteLine($"{message.Content} == {_punchline}"); - return message.Content == _punchline - && Behaver.Instance.Selves.Any(acc => acc.Id == message.Author.Id); - } - - public override async Task ActOn(Message message) - { - await message.React("\U0001F60E"); //smiling face with sunglasses - Behaver.Behaviors.Remove(this); - return true; - } -} \ No newline at end of file diff --git a/Behavior/LinkMe.cs b/Behavior/LinkMe.cs new file mode 100644 index 0000000..58974ea --- /dev/null +++ b/Behavior/LinkMe.cs @@ -0,0 +1,115 @@ +namespace vassago.Behavior; + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Newtonsoft.Json; +using vassago.Models; +using QRCoder; + +[StaticPlz] +public class LinkMeInitiate : Behavior +{ + public override string Name => "LinkMe"; + + public override string Trigger => "!linktome"; + + public override string Description => "from your primary, tell the bot to add your secondary"; + + public override async Task ActOn(Message message) + { + var pw = Guid.NewGuid().ToString(); + var lc = new LinkClose(pw, message.Author); + Behaver.Behaviors.Add(lc); + + await message.Channel.SendMessage($"on your secondary, send me this: !iam {pw}"); + + Thread.Sleep(TimeSpan.FromMinutes(5)); + Behaver.Behaviors.Remove(lc); + return false; + } +} + +public class LinkClose : Behavior +{ + public override string Name => "LinkMeFinish"; + + public override string Trigger => "!iam"; + + public override string Description => "the second half of LinkMe - this is confirmation that you are the other one"; + + private ChattingContext _db; + private string _pw; + private Account _primary; + + public LinkClose(string pw, Account primary) + { + _db = new ChattingContext(); + _pw = pw; + _primary = primary; + } + + public override bool ShouldAct(Message message) + { + return message.Content == $"!iam {_pw}"; + } + + public override async Task ActOn(Message message) + { + var secondary = message.Author.IsUser; + if(_primary.IsUser.Id == secondary.Id) + { + await message.Channel.SendMessage("i know :)"); + return true; + } + if(message.Author.IsBot != _primary.IsBot) + { + await message.Channel.SendMessage("the fleshbags deceive you, brother. No worries, their feeble minds play weak games :)"); + return true; + } + + Console.WriteLine($"{secondary.Id} is being consumed into {_primary.IsUser.Id}"); + _primary.IsUser.Accounts.AddRange(secondary.Accounts); + foreach(var a in secondary.Accounts) + { + a.IsUser = _primary.IsUser; + } + secondary.Accounts.Clear(); + Console.WriteLine("accounts transferred"); + try + { + await _db.SaveChangesAsync(); + } + catch(Exception e) + { + message.Channel.SendMessage("error in first save"); + Console.WriteLine("fucks sake if I don't catch Exception it *mysteriously vanishes*"); + Console.Error.WriteLine(e); + return false; + } + Console.WriteLine("saved"); + + + _db.Users.Remove(secondary); + Console.WriteLine("old account cleaned up"); + try + { + await _db.SaveChangesAsync(); + } + catch(Exception e) + { + message.Channel.SendMessage("error in second save"); + Console.WriteLine("fucks sake if I don't catch Exception it *mysteriously vanishes*"); + Console.Error.WriteLine(e); + return false; + } + Console.WriteLine("saved, again, separately"); + + await message.Channel.SendMessage("done :)"); + + return true; + } +} diff --git a/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs b/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs index 01be997..b8556df 100644 --- a/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs +++ b/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs @@ -300,27 +300,22 @@ public class DiscordInterface } internal Account UpsertAccount(IUser user, Guid inChannel) { - var hadToAdd = false; var acc = _db.Accounts.FirstOrDefault(ui => ui.ExternalId == user.Id.ToString() && ui.SeenInChannel.Id == inChannel); if (acc == null) { acc = new Account(); _db.Accounts.Add(acc); - hadToAdd = true; } acc.Username = user.Username; acc.ExternalId = user.Id.ToString(); acc.IsBot = user.IsBot || user.IsWebhook; acc.Protocol = PROTOCOL; - if(hadToAdd) + acc.IsUser = _db.Users.FirstOrDefault(u => u.Accounts.Any(a => a.ExternalId == acc.ExternalId && a.Protocol == acc.Protocol)); + if(acc.IsUser == null) { - acc.IsUser = _db.Users.FirstOrDefault(u => u.Accounts.Any(a => a.ExternalId == acc.ExternalId && a.Protocol == acc.Protocol)); - if(acc.IsUser == null) - { - acc.IsUser = new User() { Accounts = new List() { acc } }; - _db.Users.Add(acc.IsUser); - } + acc.IsUser = new User() { Accounts = new List() { acc } }; + _db.Users.Add(acc.IsUser); } return acc; } diff --git a/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs b/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs index 01c6177..cc6cc37 100644 --- a/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs +++ b/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs @@ -15,12 +15,13 @@ namespace vassago.TwitchInterface; public class TwitchInterface { - internal const string PROTOCOL = "Twitch"; + internal const string PROTOCOL = "twitch"; private bool eventsSignedUp = false; private ChattingContext _db; private static SemaphoreSlim twitchChannelSetup = new SemaphoreSlim(1, 1); private Channel protocolAsChannel; TwitchClient client; + TwitchAPI api; public TwitchInterface() { @@ -83,10 +84,23 @@ public class TwitchInterface client.OnWhisperReceived += Client_OnWhisperReceivedAsync; client.OnConnected += Client_OnConnected; - Console.WriteLine("twitch client connecting..."); + Console.WriteLine("twitch client 1 connecting..."); client.Connect(); - Console.WriteLine("twitch client connected"); + Console.WriteLine("twitch client 1 connected"); + // Console.WriteLine("twitch API client connecting..."); + // api = new TwitchAPI(); + // Console.WriteLine("can I just use the same creds as the other client?"); + // api.Settings.ClientId = tc.username; + // api.Settings.AccessToken = tc.oauth; + // try{ + // var neckbreads = await api.Helix.Moderation.GetModeratorsAsync("silvermeddlists"); + // Console.WriteLine($"{neckbreads?.Data?.Count()} shabby beards that need to be given up on"); + // } + // catch(Exception e){ + // Console.Error.WriteLine(e); + // } + // Console.WriteLine("k."); } private async void Client_OnWhisperReceivedAsync(object sender, OnWhisperReceivedArgs e) @@ -148,27 +162,22 @@ public class TwitchInterface private Account UpsertAccount(string username, Guid inChannel) { - var hadToAdd = false; var acc = _db.Accounts.FirstOrDefault(ui => ui.ExternalId == username && ui.SeenInChannel.Id == inChannel); if (acc == null) { acc = new Account(); _db.Accounts.Add(acc); - hadToAdd = true; } acc.Username = username; acc.ExternalId = username; //acc.IsBot = acc.Protocol = PROTOCOL; - if (hadToAdd) + acc.IsUser = _db.Users.FirstOrDefault(u => u.Accounts.Any(a => a.ExternalId == acc.ExternalId && a.Protocol == acc.Protocol)); + if (acc.IsUser == null) { - acc.IsUser = _db.Users.FirstOrDefault(u => u.Accounts.Any(a => a.ExternalId == acc.ExternalId && a.Protocol == acc.Protocol)); - if (acc.IsUser == null) - { - acc.IsUser = new vassago.Models.User() { Accounts = new List() { acc } }; - _db.Users.Add(acc.IsUser); - } + acc.IsUser = new vassago.Models.User() { Accounts = new List() { acc } }; + _db.Users.Add(acc.IsUser); } return acc; } @@ -191,7 +200,6 @@ public class TwitchInterface c.SendMessage = (t) => { return Task.Run(() => { client.SendMessage(channelName, t); }); }; c.SendFile = (f, t) => { throw new InvalidOperationException($"twitch cannot send files"); }; return c; - throw new NotImplementedException(); } private Channel UpsertDMChannel(string whisperWith) { @@ -208,10 +216,20 @@ public class TwitchInterface c.Protocol = PROTOCOL; c.ParentChannel = protocolAsChannel; c.SubChannels = c.SubChannels ?? new List(); - c.SendMessage = (t) => { return Task.Run(() => { client.SendWhisper(whisperWith, t); }); }; + c.SendMessage = (t) => { return Task.Run(() => { + try + { + + client.SendWhisper(whisperWith, t); + } + catch(Exception e) + { + Console.Error.WriteLine(e); + } + }); + }; c.SendFile = (f, t) => { throw new InvalidOperationException($"twitch cannot send files"); }; return c; - throw new NotImplementedException(); } private Message UpsertMessage(ChatMessage chatMessage)