From a5b1ac76f8ee940028a6a85cb513703044f79b9d Mon Sep 17 00:00:00 2001 From: "Adam R. Grey" Date: Mon, 25 Oct 2021 23:03:30 -0400 Subject: [PATCH] handle some twitch events thus hopefully making stream elements unnecessary --- Program.cs | 45 +++++---------------- twitchery.cs | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 34 deletions(-) create mode 100644 twitchery.cs diff --git a/Program.cs b/Program.cs index ef33c8b..d79a0f2 100644 --- a/Program.cs +++ b/Program.cs @@ -65,39 +65,16 @@ namespace silverworker_discord { if (message.Author.Username == "greasemonkey reward watcher") { - Console.WriteLine("yep"); - var redemptionData = message.Content.Split("\n")[1].Substring("data: ".Length); - - if (message.Content.StartsWith("type: reward-request")) + Console.WriteLine("heard greasemonkey, this is bananas"); + var type = message.Content.Split("\n")[0].Substring("type: ".Length); + var subData = message.Content.Split("\n")[1].Substring("data: ".Length); + try { - var components = redemptionData.Split("•"); - Console.WriteLine($"{components.Length} components:"); - var rewardName = components[0].Trim(); - var redeemer = components[1].Trim(); - var textData = ""; - if (components[1].Contains(":")) - { - redeemer = components[1].Substring(0, components[1].IndexOf(":")).Trim(); - textData = components[1].Substring(components[1].IndexOf(":")).Trim(); - } - Console.WriteLine($"user: {redeemer} redeems {rewardName}, text data? {textData}"); - - var redemptionSerialized = Encoding.ASCII.GetBytes( - JsonConvert.SerializeObject(new - { - redeemer = redeemer, - rewardName = rewardName, - textData = textData - }, Formatting.None)); - var wr = WebRequest.Create("http://192.168.1.151:3001/shortcuts/redeemReward"); - wr.Method = "POST"; - wr.ContentType = "application/json"; - wr.ContentLength = redemptionSerialized.Length; - using (var postStream = wr.GetRequestStream()) - { - postStream.Write(redemptionSerialized); - } - await wr.GetResponseAsync(); + await twitchery.twitcherize(type, subData); + } + catch(Exception e) + { + await message.Channel.SendMessageAsync($"aaaadam!\n{JsonConvert.SerializeObject(e)}"); } } } @@ -144,7 +121,7 @@ namespace silverworker_discord if(!res.Success) { Console.Error.WriteLine("tried to dl, failed. \n" + string.Join('\n', res.ErrorOutput)); - message.AddReactionAsync(new Emoji("👎")); + await message.AddReactionAsync(new Emoji("👎")); } else { @@ -164,7 +141,7 @@ namespace silverworker_discord else { Console.Error.WriteLine("idgi but something happened."); - message.AddReactionAsync(new Emoji("👎")); + await message.AddReactionAsync(new Emoji("👎")); } } } diff --git a/twitchery.cs b/twitchery.cs new file mode 100644 index 0000000..7ab7f4b --- /dev/null +++ b/twitchery.cs @@ -0,0 +1,112 @@ +using System; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace silverworker_discord +{ + //replace me with a proper twitch interface + public class twitchery + { + public static async Task twitcherize(string type, string subData) + { + string purchaser, action; + switch (type) + { + case "reward-request": + await CustomReward(subData); + break; + case "subscription": + purchaser = subData.Split("•")[0].Trim(); + action = subData.Split("•")[1].Trim(); + var subObj = JsonConvert.SerializeObject(new{ + purchaserUsername = purchaser, + actionData = action + }, Formatting.None); + if (action == "Subscribed with Prime") + { + await post("http://192.168.1.151:3001/shortcuts/primeFreshSub", subObj); + } + else if (action.StartsWith("Resubscribed with Prime.")) + { + await post("http://192.168.1.151:3001/shortcuts/primeResub", subObj); + } + else if (action.StartsWith("Gifted ")) + { + await post("http://192.168.1.151:3001/shortcuts/giftSub", subObj); + } + else if (action.StartsWith("Subscribed for")) + { + await post("http://192.168.1.151:3001/shortcuts/rawSub", subObj); + } + else if (action.StartsWith("Resubscribed for")) + { + await post("http://192.168.1.151:3001/shortcuts/rawResub", subObj); + } + break; + case "follow": + await post("http://192.168.1.151:3001/shortcuts/follow", subData.Split("•")[0].Trim()); + break; + case "monetary": + await post("http://192.168.1.151:3001/shortcuts/cheer", JsonConvert.SerializeObject(new{ + purchaserUsername = subData.Split("•")[0].Trim(), + actionData = subData.Split("•")[1].Trim() + }, Formatting.None)); + break; + case "raiding": + string partySizeStr = subData.Split("•")[1].Trim().Split(' ').Last(); + int partySize = -1; + int.TryParse(partySizeStr, out partySize); + await post("http://192.168.1.151:3001/shortcuts/raid", JsonConvert.SerializeObject(new{ + raidLeader = subData.Split("•")[0].Trim(), + partySize = partySize + }, Formatting.None)); + break; + default: + await UnhandledRedemption(type, subData); + break; + } + } + private static async Task CustomReward(string redemptionData) + { + var components = redemptionData.Split("•"); + Console.WriteLine($"{components.Length} components:"); + var rewardName = components[0].Trim(); + var redeemer = components[1].Trim(); + var textData = ""; + if (components[1].Contains(":")) + { + redeemer = components[1].Substring(0, components[1].IndexOf(":")).Trim(); + textData = components[1].Substring(components[1].IndexOf(":")).Trim(); + } + Console.WriteLine($"user: {redeemer} redeems {rewardName}, text data? {textData}"); + + var redemptionSerialized = JsonConvert.SerializeObject(new + { + redeemer = redeemer, + rewardName = rewardName, + textData = textData + }, Formatting.None); + await post("http://192.168.1.151:3001/shortcuts/redeemReward", redemptionSerialized); + } + private static async Task UnhandledRedemption(params string[] data) + { + await post("http://192.168.1.151:3001/shortcuts/unhandledRedemption", JsonConvert.SerializeObject(data, Formatting.None)); + } + private static async Task post(string endpoint, string body) + { + byte[] sendable = Encoding.ASCII.GetBytes(body); + var wr = WebRequest.Create(endpoint); + wr.Method = "POST"; + wr.ContentType = "application/json"; + wr.ContentLength = sendable.Length; + using (var postStream = wr.GetRequestStream()) + { + postStream.Write(sendable); + } + await wr.GetResponseAsync(); + } + } +} \ No newline at end of file