diff --git a/DiscoBot/98293701175955456-gsmeet.db b/DiscoBot/98293701175955456-gsmeet.db index 3e25954..60dff19 100644 Binary files a/DiscoBot/98293701175955456-gsmeet.db and b/DiscoBot/98293701175955456-gsmeet.db differ diff --git a/DiscoBot/98293701175955456-rss.db b/DiscoBot/98293701175955456-rss.db index e13d6ec..5fdb362 100644 Binary files a/DiscoBot/98293701175955456-rss.db and b/DiscoBot/98293701175955456-rss.db differ 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; } } }