From 439fc81aab80754606dbb53a0be501d748e356c5 Mon Sep 17 00:00:00 2001 From: amki Date: Sat, 19 Oct 2019 04:04:07 +0200 Subject: [PATCH] Birthday Module deploy --- DiscoBot/615631052047908870-bdaygreet.db | Bin 12288 -> 12288 bytes DiscoBot/98293701175955456-bdaygreet.db | Bin 12288 -> 12288 bytes DiscoBot/98293701175955456-rss.db | Bin 20480 -> 20480 bytes DiscoBot/DisBot.cs | 5 +- DiscoBot/bdaygreet/BDayGreet.cs | 144 ++++++++++++++--------- DiscoBot/bdaygreet/BDayGreetContext.cs | 2 +- DiscoBot/gsmeet/GSMeetingTimers.cs | 8 +- 7 files changed, 99 insertions(+), 60 deletions(-) diff --git a/DiscoBot/615631052047908870-bdaygreet.db b/DiscoBot/615631052047908870-bdaygreet.db index 04ec41b934e690f72ff534c603d17b5ef8b216ac..2fbc4c67794b9719732dd764217d71525a680ac5 100644 GIT binary patch delta 16 XcmZojXh_(wiJ#dowPN#Des2W;Iba4t delta 16 XcmZojXh_(wiJ#dgv3T=Ves2W;ITi*t diff --git a/DiscoBot/98293701175955456-bdaygreet.db b/DiscoBot/98293701175955456-bdaygreet.db index ad43f049bc4d5e5d43ce8b313800a11f6d17628b..4f94444541768b7960b4615e25882ed756f00ad8 100644 GIT binary patch delta 47 ucmZojXh_(wiJ#dowPN#Den9~)BLhQAT|)z1BZJ8oWae@>R)1rwoPC#;F!Zs@|a|I(KD?=kIBcsU**1Wae@>RPC#;F!Zs@|GX+CSD+4ntLxaf**1=pR3Pwg&CMH%!W}9oR zuQ5WUjX~0}w#gg@Mpg!vRwibXPuM1M7#LcC_@ "BDayGreet"; set => throw new NotImplementedException(); } private SocketGuild guild; private BDayGreetContext bdayGreetContext; - private Dictionary timers = new Dictionary(); + private Timer updateTimer = new Timer(); private List webSockets = new List(); public Dictionary> Commands { get; set; } = new Dictionary>(); @@ -27,10 +28,7 @@ namespace DiscoBot.bdaygreet this.guild = guild; bdayGreetContext = new BDayGreetContext(guild.Id); bdayGreetContext.Database.EnsureCreated(); - foreach(var f in bdayGreetContext.BDays) - { - //InitializeFeed(f); - } + InitializeCheck(); Commands.Add("bdayadd", HandleBDayAddCommand); Commands.Add("bdaydel", HandleBDayDelCommand); @@ -38,24 +36,32 @@ namespace DiscoBot.bdaygreet Commands.Add("bdaydebug", HandleBDayDebugCommand); } - /* - private Task InitializeFeed(BDayUser feed) + private void SetTimer() { - Console.WriteLine("Found feed " + feed.Name); - - Timer timer = new Timer(feed.CheckInterval.TotalMilliseconds); - timer.AutoReset = true; - timer.Elapsed += async (sender, e) => + updateTimer.Dispose(); + var now = DateTime.Now; + //DateTimeOffset next = now.AddHours(1).AddMinutes(-now.Minute).AddSeconds(-now.Second); + DateTimeOffset next = now.AddMinutes(1).AddSeconds(-now.Second); + var span = next - now; + Console.WriteLine("Next bday timer is: " + next + " in " + span.TotalMilliseconds + "ms."); + updateTimer = new Timer(span.TotalMilliseconds); + updateTimer.AutoReset = false; + updateTimer.Elapsed += async (sender, e) => { - await Task.Run(() => HandleBDayCheck(feed)); + await Task.Run(() => HandleBDayCheck()); }; - timer.Start(); - timers.Add(feed.Name, timer); + updateTimer.Start(); + } - HandleBDayCheck(feed); + private Task InitializeCheck() + { + Console.WriteLine("Starting check timer!"); + SetTimer(); + HandleBDayCheck(); return Task.CompletedTask; } + /* private Task DeinitializeFeed(BDayFeed feed) { Timer t = timers[feed.Name]; @@ -63,48 +69,42 @@ namespace DiscoBot.bdaygreet timers.Remove(feed.Name); return Task.CompletedTask; } - - private Task HandleBDayCheck(BDayFeed feed) + */ + private async Task HandleBDayCheck() { - SocketTextChannel c = guild.Channels.Where(g => g.Id == feed.Channel).Single() as SocketTextChannel; - c.SendMessageAsync("Yes yes i will check."); - - try + Console.WriteLine("Checktime!"); + var bdays = bdayGreetContext.BDays; + foreach(var bday in bdays) { - XmlReader reader = XmlReader.Create(feed.Url); - SyndicationFeed f = SyndicationFeed.Load(reader); - DateTimeOffset newestItem = feed.LastChecked; - foreach(var item in f.Items) + SocketTextChannel c = guild.Channels.Where(g => g.Id == bday.Channel).Single() as SocketTextChannel; + //await c.SendMessageAsync("Checking " + bday.DiscordTag + "'s birthday. NextGreet: "+bday.NextGreet); + var now = DateTimeOffset.Now; + if(bday.NextGreet < now) { - if (item.LastUpdatedTime <= feed.LastChecked) - continue; - Console.WriteLine("{0}: {1} | {2}", feed.Name, item.LastUpdatedTime, feed.LastChecked); - List m = new List(); - m.Add("<" + feed.Name + "> " + item.Title.Text); - if(item.LastUpdatedTime > newestItem) + var call = ""; + try + { + call = guild.Users.Where(gu => (gu.Username + "#" + gu.DiscriminatorValue) == bday.DiscordTag).Single().Mention; + } + catch (InvalidOperationException e) { - Console.WriteLine("^-- UPDATE!"); - newestItem = item.LastUpdatedTime; + // Too spammy, do something about it? Don't rely on u.User + //c.SendMessageAsync("Could not find User "+ u.DiscordTag+" in Discord, cannot mention."); + call = bday.DiscordTag; } - foreach (var l in item.Links) + if (bday.NextGreet.Day == now.Day && bday.NextGreet.Month == now.Month) { - m.Add(l.Uri.ToString()); + await c.SendMessageAsync("Today is "+call+"'s birthday! Happy Birthday " + call+"!"); + } else + { + await c.SendMessageAsync("Happy belated Birthday " + call+"! I guess I was offline when it happened. :("); } - c.SendMessageAsync(string.Join(" | ", m)); + bday.NextGreet = bday.NextGreet.AddYears(1); + bdayGreetContext.SaveChanges(); } - feed.LastChecked = newestItem; - rssContext.SaveChangesAsync(); - } catch(System.Net.WebException e) - { - c.SendMessageAsync("<" + feed.Name + "> " + "NetworkFailure: " + e.Message); - } catch(XmlException e) - { - c.SendMessageAsync("<" + feed.Name + "> " + "Malformed Response: " + e.Message); } - - return Task.CompletedTask; + SetTimer(); } - */ private async Task HandleBDayAddCommand(SocketMessage msg, string[] parameters) { @@ -130,25 +130,51 @@ namespace DiscoBot.bdaygreet } DateTimeOffset d; try { - d = DateTimeOffset.Parse(date, null, DateTimeStyles.AssumeUniversal); + d = DateTimeOffset.ParseExact(date,new string[] { "dd.MM.", "d.MM", "dd.M", "d.M." }, null, DateTimeStyles.AssumeUniversal); } catch(FormatException) { await msg.Channel.SendMessageAsync("Sorry I can't parse your date. Please try again!"); return; } - await msg.Channel.SendMessageAsync("Add " + name + " on " + d); var bday = new BDayUser(); bday.DiscordTag = user.Username + "#" + user.DiscriminatorValue; bday.Channel = msg.Channel.Id; bday.BirthDate = d; - bday.LastGreet = d.AddYears(-1); - bdayGreetContext.Add(bday); - bdayGreetContext.SaveChanges(); - await msg.Channel.SendMessageAsync("I remembered that " + name + "'s next birthday "); + if(bday.BirthDate > DateTimeOffset.Now) + { + bday.NextGreet = bday.BirthDate; + } else + { + if(bday.BirthDate.Day == DateTimeOffset.Now.Day && bday.BirthDate.Month == DateTimeOffset.Now.Month) + { + bday.NextGreet = bday.BirthDate; + } else + { + bday.NextGreet = bday.BirthDate.AddYears(1); + } + } + + try + { + bdayGreetContext.Add(bday); + bdayGreetContext.SaveChanges(); + await msg.Channel.SendMessageAsync("I remembered that " + name + "'s next birthday is on " + bday.NextGreet.ToString("dd.MM.yyyy")); + } + catch (InvalidOperationException) + { + await msg.Channel.SendMessageAsync("I can't add " + name + ". Looks like they are already in the database?"); + return; + } } private async Task HandleBDayListCommand(SocketMessage msg, string[] parameters) { + var gauthor = guild.Users.Where(u => u.Id == msg.Author.Id).Single(); + if (!gauthor.GuildPermissions.Administrator) + { + await msg.Channel.SendMessageAsync("Sorry only administrators can list birthdays :("); + return; + } var bdays = bdayGreetContext.BDays.Where(b => b.Channel == msg.Channel.Id).ToList(); List m = new List(); m.Add("I am tracking birthdays for: "); @@ -170,6 +196,12 @@ namespace DiscoBot.bdaygreet private async Task HandleBDayDelCommand(SocketMessage msg, string[] parameters) { + var gauthor = guild.Users.Where(u => u.Id == msg.Author.Id).Single(); + if (!gauthor.GuildPermissions.Administrator) + { + await msg.Channel.SendMessageAsync("Sorry only administrators can delete birthdays :("); + return; + } var gchan = msg.Channel as IGuildChannel; string tag = parameters[1]; try @@ -177,10 +209,10 @@ namespace DiscoBot.bdaygreet var b = bdayGreetContext.BDays.Where(b => b.DiscordTag == tag).Single(); bdayGreetContext.Remove(b); bdayGreetContext.SaveChanges(); - await msg.Channel.SendMessageAsync("Removed birthday " + b.DiscordTag); + await msg.Channel.SendMessageAsync("Removed "+ b.DiscordTag+"'s birthday from the database."); } catch(InvalidOperationException) { - await msg.Channel.SendMessageAsync("Could not find " + tag+"'s birthday. Add it!"); + await msg.Channel.SendMessageAsync("Could not find " + tag+"'s birthday."); } } diff --git a/DiscoBot/bdaygreet/BDayGreetContext.cs b/DiscoBot/bdaygreet/BDayGreetContext.cs index 210c7c4..8ead0fa 100644 --- a/DiscoBot/bdaygreet/BDayGreetContext.cs +++ b/DiscoBot/bdaygreet/BDayGreetContext.cs @@ -29,7 +29,7 @@ namespace DiscoBot.bdaygreet public string DiscordTag { get; set; } public DateTimeOffset BirthDate { get; set; } public ulong Channel { get; set; } - public DateTimeOffset LastGreet { get; set; } + public DateTimeOffset NextGreet { get; set; } } } diff --git a/DiscoBot/gsmeet/GSMeetingTimers.cs b/DiscoBot/gsmeet/GSMeetingTimers.cs index 202389e..1bdcb2e 100644 --- a/DiscoBot/gsmeet/GSMeetingTimers.cs +++ b/DiscoBot/gsmeet/GSMeetingTimers.cs @@ -62,18 +62,22 @@ namespace DiscoBot.gsmeet var users = meeting.Users; t.Elapsed += async (sender, e) => { + string m = "Heyo! There is a raid on "+date+" but"; + foreach(var user in users) { if(user.Signups[idx] != "1" && user.Signups[idx] != "0" && user.Signups[idx] != "0.5") { if(user.User != null) { - await chan.SendMessageAsync("Hey " + user.User.Mention + " could you please sign up for our raid on " + date + "?"); + m += user.User.Mention + " "; } else { - await chan.SendMessageAsync("Hey " + user.Name + " could you please sign up for our raid on " + date + "?"); + m += user.Name + " "; } } } + m += "did not sign up for it. Please sign up!"; + await chan.SendMessageAsync(m); }; t.Start(); evt.UserTimers.Add(t);