From 096bcb7d598252d36311530b29d642adb6b42bb2 Mon Sep 17 00:00:00 2001 From: amki Date: Tue, 1 Oct 2019 22:34:43 +0200 Subject: [PATCH] Implement GSMeet features --- DiscoBot/98293701175955456-gsmeet.db | Bin 12288 -> 32768 bytes DiscoBot/98293701175955456-rss.db | Bin 20480 -> 20480 bytes DiscoBot/gsmeet/GSMeet.cs | 95 +++++++++++++++++++++++---- DiscoBot/gsmeet/GSMeetContext.cs | 48 ++++++++++++-- 4 files changed, 127 insertions(+), 16 deletions(-) diff --git a/DiscoBot/98293701175955456-gsmeet.db b/DiscoBot/98293701175955456-gsmeet.db index 3e259541b6281245bf655ee6c646c24fef63adec..60dff19770a561a7f2df767df732f9d81b9604f8 100644 GIT binary patch literal 32768 zcmeI(-%i?490%|gg(}M2jUkI!a?;&sgoT1`L2rg|FpW^K)G1e{;!()7M5#_Mo$-FJ zu~*m|_zGU`Zf~&5oz}vDg4+_~1%6K;^v~(}^ZES_rht{rLc?a{pm}<1+9V~s6aoR^ z10jMS1o(4;Kieh9H^$pL{8jAQ9<~_}-p0z2nO}l5c_+O1K64w1P2Wu|g>U#S3Irek z0SG_<0uX?}qY7NjOHy<@EnXEH);_yXcXrn+MaJx{7CY6NcH^K?Gwnvx+Rd$1>ioE7 z9<#wUCbBxs7?h}5j_wfopIVYhNh9*$_GB_IcXcW+T*X3Cw7M!@ZT1e8o-@mSc&xrE z(vZRWDt6Did$hiazTsZK2};p)TD&oBbMI&f+Tf{&ywMq%wE}&>ClV&S$m+h#)eX8% zb)uCFqHPrlBwNxdhMwWaiCo?o5>=U$b+wq$t7L;#NoLC^sT%LQNHrtoHJ)pJk);{cY+&T3pU)nYJu)MR~gUb&a93Qijajo7E4RPkHz#k|OfB*y_009U<00Izz00bZa0SG*ifF(+^ z>{aM>$!0BE*-jlBd++MGk2O9~@JClr!Qt|&_@sin86#By3$PA(>ryiSAdSsVIv+7O-~aO;{i8qt0uX=z1Rwwb2tWV=5P$## zATYuLxc?vF;9_bJfB*y_009U<00Izz00bZa0Z#z;|40Q0KmY;|fB*y_009U<00Izz zz~~D&|NoEQ|Brs0F+&JI00Izz00bZa0SG_<0uXrK0=WNw-toumApijgKmY;|fB*y_ M009U<;CTrA1|3opN&o-= delta 92 zcmZo@U}{L1AkWLpfB=jWb!<48__i|eZRJ0?Sx~^0kE=Wae@>RBhN$`Cm^{oVUrb~p@FV}p@N~gm5HI1f!SmQYk!!Kk(G&&m67@6 zTI*~s3y=yRGB%$4$@($3k(q)aP}dnuSP`hXKod-?3=Fgl z41nb1bF!f@wPsdEmR2UllMU_4VM1W-CMJ`&+4)OAwOd#jSX!ByL$ot6FjP;Ll|PSA XZ)#~}V6^#{{WUIDu!hZ7y|h^Y+*&yX delta 230 zcmXwyy$%6E6h@asL#PxY#PlM$_nO(=`PNUO)aY~)y+WxFiANyw0$u@$#}Ey*#2YA8 z#-h2!mwV1x?=tIMW>d`uuWfDM?|ynfiEK-ZB7qi|*r{ZcPNLXALWp*&WR^FIBS?g{ zanIyYV5>NU(a_}Xo%v6~1hL@QO}dlv*UK7h0of)Ih}^k8E~Y(i^L}Q>y~Ur7VA7{k oZ&dlwF}zcUUpfearK>kCAA|2(ABULZtAESqNVgPx# diff --git a/DiscoBot/gsmeet/GSMeet.cs b/DiscoBot/gsmeet/GSMeet.cs index 34f7e67..01ab1c3 100644 --- a/DiscoBot/gsmeet/GSMeet.cs +++ b/DiscoBot/gsmeet/GSMeet.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Net.WebSockets; @@ -28,6 +29,8 @@ namespace DiscoBot.gsmeet private static readonly string ApplicationName = "DiscoBot"; private SheetsService service; + + public GSMeet(SocketGuild guild) { this.guild = guild; @@ -48,6 +51,7 @@ namespace DiscoBot.gsmeet foreach(var f in gsmeetContext.GSheets) { InitializeSheet(f); + HandleSheetCheck(f); } Commands.Add("gsmeetadd", HandleGSMeetAddCommand); @@ -56,7 +60,7 @@ namespace DiscoBot.gsmeet Commands.Add("gsmeetdebug", HandleGSMeetDebugCommand); } - private Task InitializeSheet(GSheet sheet) + private Task InitializeSheet(DBSheet sheet) { Console.WriteLine("Found sheet " + sheet.Name); Timer timer = new Timer(sheet.CheckInterval.TotalMilliseconds); @@ -70,7 +74,7 @@ namespace DiscoBot.gsmeet return Task.CompletedTask; } - private Task DeinitializeSheets(GSheet sheet) + private Task DeinitializeSheets(DBSheet sheet) { /* Timer t = timers[feed.Name]; @@ -80,16 +84,85 @@ namespace DiscoBot.gsmeet return Task.CompletedTask; } - private Task HandleSheetCheck(GSheet sheet) + private Task ParseGSMeetSheet(GSMeetSheetData sheetData, IList> values) + { + var daterow = values[1]; + var time = TimeSpan.Parse((string)daterow[0]); + var events = new List(); + var users = new List(); + for (int i = 2; i < daterow.Count; ++i) + { + var col = daterow[i]; + var d = DateTimeOffset.Parse((string)col, null, DateTimeStyles.AssumeUniversal); + events.Add(d + time); + } + for (int i = 2; i < values.Count; ++i) + { + var row = values[i]; + GSMeetUser u = new GSMeetUser(); + u.DiscordTag = (string)row[0]; + u.Name = (string)row[1]; + for (int j = 2; j < row.Count; ++j) + { + var str = (string)row[j]; + if(str != "") + u.Signups.Add(events[j - 2], str); + } + users.Add(u); + } + sheetData.Dates = events; + sheetData.Users = users; + return Task.CompletedTask; + } + + private async Task SignupNotify(SocketTextChannel chan, GSMeetSheetData sheetData) + { + foreach(var date in sheetData.Dates) + { + + if(DateTimeOffset.UtcNow + new TimeSpan(4,0,0,0) > date) + { + await chan.SendMessageAsync("I should signup notify for " + date); + foreach (var user in sheetData.Users) + { + if (!user.Signups.ContainsKey(date)) + { + await chan.SendMessageAsync("Hey " + user.DiscordTag + " please sign up for our raid on " + date); + } + } + } + } + } + + private async Task RaidNotify(SocketTextChannel chan, GSMeetSheetData sheetData) + { + foreach (var date in sheetData.Dates) + { + + if (DateTimeOffset.UtcNow + new TimeSpan(2,0,0,0) > date) + { + await chan.SendMessageAsync("I should raid notify for " + date); + // + } + } + } + + + private async Task HandleSheetCheck(DBSheet sheet) { + var sheetData = new GSMeetSheetData(sheet); SocketTextChannel c = guild.Channels.Where(g => g.Id == sheet.Channel).Single() as SocketTextChannel; - c.SendMessageAsync("Checking sheet " + sheet.SheetId + " :3"); - var values = FetchRangeFromSheet(sheet.SheetId, $"{sheet.SheetName}!A1:I10"); + await c.SendMessageAsync("Checking sheet " + sheet.Id + " :3"); + var values = FetchRangeFromSheet(sheet.Id, $"{sheet.SheetName}!A1:I10"); if (values == null || values.Count < 1) { - c.SendMessageAsync("No values found."); - return Task.CompletedTask; + await c.SendMessageAsync("No values found."); } + await ParseGSMeetSheet(sheetData, values); + await c.SendMessageAsync("Parsed sheet " + sheet.Id); + await SignupNotify(c, sheetData); + await RaidNotify(c, sheetData); + /* var str = ""; foreach (var row in values) { @@ -100,7 +173,7 @@ namespace DiscoBot.gsmeet str += "\n"; } c.SendMessageAsync("Result: " + str); - return Task.CompletedTask; + */ } private Task HandleGSMeetAddCommand(SocketMessage msg, string[] parameters) @@ -112,10 +185,10 @@ namespace DiscoBot.gsmeet try { int timeSec = Int32.Parse(parameters[4]); - GSheet sheet = new GSheet(); + DBSheet sheet = new DBSheet(); sheet.Channel = gchan.Id; sheet.Name = name; - sheet.SheetId = sheetId; + sheet.Id = sheetId; sheet.SheetName = sheetName; sheet.LastChecked = DateTimeOffset.Now; sheet.CheckInterval = new TimeSpan(0, 0, timeSec); @@ -124,7 +197,7 @@ namespace DiscoBot.gsmeet { gsmeetContext.SaveChanges(); InitializeSheet(sheet); - msg.Channel.SendMessageAsync("Sheet " + sheet.Name + " with id " + sheet.SheetId + " saved."); + msg.Channel.SendMessageAsync("Sheet " + sheet.Name + " with id " + sheet.Id + " saved."); } catch (InvalidOperationException) { diff --git a/DiscoBot/gsmeet/GSMeetContext.cs b/DiscoBot/gsmeet/GSMeetContext.cs index 2e78e10..ad605ad 100644 --- a/DiscoBot/gsmeet/GSMeetContext.cs +++ b/DiscoBot/gsmeet/GSMeetContext.cs @@ -2,15 +2,17 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Timers; using System.Linq; using System.Threading.Tasks; +using System.ComponentModel.DataAnnotations.Schema; namespace DiscoBot.gsmeet { public class GSMeetContext : DbContext { private ulong guildId; - public DbSet GSheets { get; set; } + public DbSet GSheets { get; set; } public GSMeetContext(ulong guildId) { @@ -23,21 +25,57 @@ namespace DiscoBot.gsmeet } } - public class GSheet + public class DBSheet { [Key] public string Name { get; set; } - public string SheetId { get; set; } + public string Id { get; set; } public string SheetName { get; set; } public ulong Channel { get; set; } public TimeSpan CheckInterval { get; set; } public DateTimeOffset LastChecked { get; set; } + public List NotifiedEvents { get; set; } + public List NotifiedDates { get; set; } } - public class GSSignup + public class GSMeetEventNotification { + [ScaffoldColumn(false)] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + [Key] + public long Id { get; set; } + public DateTimeOffset Date { get; set; } + } + + public class GSMeetUserNotification + { + [ScaffoldColumn(false)] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + [Key] + public long Id { get; set; } + public string DiscordTag { get; set; } + public DateTimeOffset Date { get; set; } + } + + public class GSMeetSheetData + { + public GSMeetSheetData(DBSheet sheet) + { + this.Sheet = sheet; + } + public DBSheet Sheet { get; set; } + public List Users { get; set; } + public List Dates { get; set; } + } + + public class GSMeetUser + { + public GSMeetUser() + { + this.Signups = new Dictionary(); + } public string DiscordTag { get; set; } public string Name { get; set; } - public string[] Signups { get; set; } + public Dictionary Signups { get; set; } } }