From cf4ab2a15c115346ffde705afcdc4e433c166315 Mon Sep 17 00:00:00 2001 From: amki Date: Thu, 17 Oct 2019 05:48:22 +0200 Subject: [PATCH] Add basic commands for birthday greet --- DiscoBot/615631052047908870-bdaygreet.db | Bin 0 -> 12288 bytes DiscoBot/615631052047908870-gsmeet.db | Bin 32768 -> 32768 bytes DiscoBot/615631052047908870-gsmeet.db-shm | Bin 32768 -> 0 bytes DiscoBot/615631052047908870-gsmeet.db-wal | Bin 4152 -> 0 bytes DiscoBot/98293701175955456-bdaygreet.db | Bin 0 -> 12288 bytes DiscoBot/98293701175955456-gsmeet.db-shm | Bin 32768 -> 0 bytes DiscoBot/98293701175955456-gsmeet.db-wal | 0 DiscoBot/bdaygreet/BDayGreet.cs | 206 ++++++++++++++++++++++ DiscoBot/bdaygreet/BDayGreetContext.cs | 35 ++++ DiscoBot/gsmeet/GSMeetingTimers.cs | 2 +- 10 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 DiscoBot/615631052047908870-bdaygreet.db delete mode 100644 DiscoBot/615631052047908870-gsmeet.db-shm delete mode 100644 DiscoBot/615631052047908870-gsmeet.db-wal create mode 100644 DiscoBot/98293701175955456-bdaygreet.db delete mode 100644 DiscoBot/98293701175955456-gsmeet.db-shm delete mode 100644 DiscoBot/98293701175955456-gsmeet.db-wal create mode 100644 DiscoBot/bdaygreet/BDayGreet.cs create mode 100644 DiscoBot/bdaygreet/BDayGreetContext.cs diff --git a/DiscoBot/615631052047908870-bdaygreet.db b/DiscoBot/615631052047908870-bdaygreet.db new file mode 100644 index 0000000000000000000000000000000000000000..04ec41b934e690f72ff534c603d17b5ef8b216ac GIT binary patch literal 12288 zcmeI#&riZI6bJCG{tU^0+paG=NkUAFXA=iBgfIt=n#hS%sj>tiZY9y9@$d8R!K2+| z9=LGvM7}R+x3{iu?PsTsZo|ZAdRnG0%FrdNGtSvH5o3(oc3@i>j=ec76MN0`UBTIT zbLiH-8LzHcbzS?~H38!gfB*y_009U<00Izz00bZafqxYE7&#}N=Q*E8Mm@}RtE1kt zqT}sY1X7R;TA?7nc;?fYTOk{MC&?a{=~Sv`pQN~#6b)><3qxuTqLGY)UL?sM_9vTp z!?<@7#AE7ZFgUg!2?KT#{QEb`wqO)iS1<>&g-+|$jwdfp)*009U<00Izz00bZa0SG_< n0ub0&fl9tHod5Ur_hMfVfB*y_009U<00Izz00bZafkNO1Bim6} literal 0 HcmV?d00001 diff --git a/DiscoBot/615631052047908870-gsmeet.db b/DiscoBot/615631052047908870-gsmeet.db index 32fb450bd2afb144a83c48f29120e166d5042590..b43463ee236cac8f78da536011b6f5f540f4c940 100644 GIT binary patch delta 40 wcmZo@U}|V!+Q25jGKqnI(q=)04t};AMt0Fu(aF=~jahsXGxIi|mp4oR0OrXHyZ`_I delta 42 ycmZo@U}|V!+Q25jGJ%1A!e&8*Hh#7|Mt0Fu$;mV1joFGbQd3I|H=ma`OaK7?r3{4t diff --git a/DiscoBot/615631052047908870-gsmeet.db-shm b/DiscoBot/615631052047908870-gsmeet.db-shm deleted file mode 100644 index d0b2c9ec9f134a0743550dc347c4558c2029752d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI)u?fOZ5C-6wDrjSwCDK_5A>c4Jsgeycf|X$D3PJ|3S8#;5NX&~8(%Ol9KOA>F z9#?z=T>8wSkj1;!p(jH%-L5L`*URCyJoU%?yxEuSYFj_jFaHm##)Q57ET8A8#nWUU zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!Cvi3xu02LVy4P0t5&UAV7cs0RjXF5FkK+009C7 u2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNCfTLLd6(I+1O diff --git a/DiscoBot/615631052047908870-gsmeet.db-wal b/DiscoBot/615631052047908870-gsmeet.db-wal deleted file mode 100644 index e5fedceb128d34ea9923c86fe814a1df3968e760..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4152 zcmXr7XKP~6eI&uaAiw|u6VGzZ`aj)vQQpT3OHPVAcmRc%fS3a&Ug-3&ar2>b_Pjtr zM*c|*Kr{+QLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz91t0y&KAqN$>6 zvi?DdnJI?h#TPGO@5SGSf3MG%+x;u+#=C0071I BGZFv* diff --git a/DiscoBot/98293701175955456-bdaygreet.db b/DiscoBot/98293701175955456-bdaygreet.db new file mode 100644 index 0000000000000000000000000000000000000000..ad43f049bc4d5e5d43ce8b313800a11f6d17628b GIT binary patch literal 12288 zcmeI$Jx{_w7zglc5!A+lTSqQ+kqD-Q0WdMhOM`?8SZX2@Ii*S?FOk+nN8_jQ3-}!z z{1R@?4mf&L%3w@b9E|xtx#!yJz4ZFquI*#P@oaiAo(!2sGh~y9A~~Rx5F+vn@eD%X zH!DGdUuW%QA(Gu>OOAaIF*+sDY3ya$1oT4y0uX=z1Rwwb2tWV=5P$##eo^4QEvzbv zB0PjWb~dm}6?W(Pl~^|QqNP)-STb~~`p;ClElZS#T5;U-@uX+5OO;yssYM%2o+pMu z%gsjHGK;l_Mb%clJD=AwYez-1L+g4cIbWjWOuT-DdG@yzg8p)!jYjrBrF<#9s+)^f z1Op7_dew<-d*2q2r9?uEDEo>)oKerdb*~5fWZz{s-q>${?Wvpgw>CT1ugyGVo{5kjp DdeLYb literal 0 HcmV?d00001 diff --git a/DiscoBot/98293701175955456-gsmeet.db-shm b/DiscoBot/98293701175955456-gsmeet.db-shm deleted file mode 100644 index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuAr62r3 "BDayGreet"; set => throw new NotImplementedException(); } + private SocketGuild guild; + private BDayGreetContext bdayGreetContext; + private Dictionary timers = new Dictionary(); + private List webSockets = new List(); + + public Dictionary> Commands { get; set; } = new Dictionary>(); + + public BDayGreet(SocketGuild guild) + { + this.guild = guild; + bdayGreetContext = new BDayGreetContext(guild.Id); + bdayGreetContext.Database.EnsureCreated(); + foreach(var f in bdayGreetContext.BDays) + { + //InitializeFeed(f); + } + + Commands.Add("bdayadd", HandleBDayAddCommand); + Commands.Add("bdaydel", HandleBDayDelCommand); + Commands.Add("bdaylist", HandleBDayListCommand); + Commands.Add("bdaydebug", HandleBDayDebugCommand); + } + + /* + private Task InitializeFeed(BDayUser feed) + { + Console.WriteLine("Found feed " + feed.Name); + + Timer timer = new Timer(feed.CheckInterval.TotalMilliseconds); + timer.AutoReset = true; + timer.Elapsed += async (sender, e) => + { + await Task.Run(() => HandleBDayCheck(feed)); + }; + timer.Start(); + timers.Add(feed.Name, timer); + + HandleBDayCheck(feed); + return Task.CompletedTask; + } + + private Task DeinitializeFeed(BDayFeed feed) + { + Timer t = timers[feed.Name]; + t.Stop(); + timers.Remove(feed.Name); + return Task.CompletedTask; + } + + private Task HandleBDayCheck(BDayFeed feed) + { + SocketTextChannel c = guild.Channels.Where(g => g.Id == feed.Channel).Single() as SocketTextChannel; + c.SendMessageAsync("Yes yes i will check."); + + try + { + XmlReader reader = XmlReader.Create(feed.Url); + SyndicationFeed f = SyndicationFeed.Load(reader); + DateTimeOffset newestItem = feed.LastChecked; + foreach(var item in f.Items) + { + 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) + { + Console.WriteLine("^-- UPDATE!"); + newestItem = item.LastUpdatedTime; + } + foreach (var l in item.Links) + { + m.Add(l.Uri.ToString()); + } + c.SendMessageAsync(string.Join(" | ", m)); + } + 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; + } + */ + + private async Task HandleBDayAddCommand(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 add birthdays :("); + return; + } + var gchan = msg.Channel as IGuildChannel; + string name = parameters[1]; + string date = parameters[2]; + + SocketGuildUser user; + try + { + user = guild.Users.Where(u => u.Mention == name).Single(); + } + catch (InvalidOperationException) + { + await msg.Channel.SendMessageAsync("I can't find user " + name + " so I can't add them."); + return; + } + DateTimeOffset d; + try { + d = DateTimeOffset.Parse(date, 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 "); + } + + private async Task HandleBDayListCommand(SocketMessage msg, string[] parameters) + { + var bdays = bdayGreetContext.BDays.Where(b => b.Channel == msg.Channel.Id).ToList(); + List m = new List(); + m.Add("I am tracking birthdays for: "); + int cnt = 0; + string str = ""; + foreach(var bday in bdays) + { + str += bday.DiscordTag + " "; + cnt++; + if(cnt > 4) + { + m.Add(str); + str = ""; + } + } + m.Add(str); + await msg.Channel.SendMessageAsync(string.Join("\n",m)); + } + + private async Task HandleBDayDelCommand(SocketMessage msg, string[] parameters) + { + var gchan = msg.Channel as IGuildChannel; + string tag = parameters[1]; + try + { + var b = bdayGreetContext.BDays.Where(b => b.DiscordTag == tag).Single(); + bdayGreetContext.Remove(b); + bdayGreetContext.SaveChanges(); + await msg.Channel.SendMessageAsync("Removed birthday " + b.DiscordTag); + } catch(InvalidOperationException) + { + await msg.Channel.SendMessageAsync("Could not find " + tag+"'s birthday. Add it!"); + } + } + + private Task HandleBDayDebugCommand(SocketMessage msg, string[] parameters) + { + Console.WriteLine("Handling test command!"); + string para = string.Join(",", parameters); + msg.Channel.SendMessageAsync("Test succeeded. Params: "+para); + return Task.CompletedTask; + } + + public void Initialize() + { + Console.WriteLine("Initializing bdaygreet..."); + } + + public async Task OnNewWebSocketAsync(WebSocket ws, TaskCompletionSource tcs) + { + Console.WriteLine("Calendar " + guild.Id + " has a new websocket."); + webSockets.Add(ws); + } + } +} diff --git a/DiscoBot/bdaygreet/BDayGreetContext.cs b/DiscoBot/bdaygreet/BDayGreetContext.cs new file mode 100644 index 0000000..210c7c4 --- /dev/null +++ b/DiscoBot/bdaygreet/BDayGreetContext.cs @@ -0,0 +1,35 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Threading.Tasks; + +namespace DiscoBot.bdaygreet +{ + public class BDayGreetContext : DbContext + { + private ulong guildId; + public DbSet BDays { get; set; } + + public BDayGreetContext(ulong guildId) + { + this.guildId = guildId; + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlite("Data Source=" + guildId + "-bdaygreet.db"); + } + } + + public class BDayUser + { + [Key] + public string DiscordTag { get; set; } + public DateTimeOffset BirthDate { get; set; } + public ulong Channel { get; set; } + public DateTimeOffset LastGreet { get; set; } + + } +} diff --git a/DiscoBot/gsmeet/GSMeetingTimers.cs b/DiscoBot/gsmeet/GSMeetingTimers.cs index 2725b4c..202389e 100644 --- a/DiscoBot/gsmeet/GSMeetingTimers.cs +++ b/DiscoBot/gsmeet/GSMeetingTimers.cs @@ -63,7 +63,7 @@ namespace DiscoBot.gsmeet t.Elapsed += async (sender, e) => { foreach(var user in users) - { + { if(user.Signups[idx] != "1" && user.Signups[idx] != "0" && user.Signups[idx] != "0.5") { if(user.User != null) {